打保齡球問題__string
來源:互聯網
上載者:User
/*
【類比試題】:打保齡球(normal)
Time Limit:1000MS Memory Limit:65536K
Total Submit:58 Accepted:9
Description
打保齡球是用一個滾球去打擊十個站立的柱,將柱擊倒。一局分十輪,每輪可滾球一次或多次,以擊倒的柱數為依據計分。一局得分為十輪得分之和,而每輪的得分不僅與本輪滾球情況有關,還可能與後續一兩輪的滾球情況有關。即某輪某次滾球擊倒的柱數不僅要計入本輪得分,還可能會計入前一兩輪得分。具體的滾球擊柱規則和計分方法如下:
(1)若某一輪的第一次滾球就擊倒全部十個柱,則本輪不再滾球(若是第十輪則還需
另加兩次滾球,不妨稱其為第十一輪和第十二輪,並不是所有的情況都需要滾第十一輪和第十二輪球)。該輪得分為本次擊倒柱數10與以後兩次滾球所擊倒柱數之和。
(2)若某一輪的第一次滾球未擊倒十個柱,則可對剩下未倒的柱再滾球一次。如果這
兩次滾球擊倒全部十個柱,則本輪不再滾球(若是第十輪則還需另加一次滾球),該輪得分
為這兩次共擊倒柱數10與以後一次滾球所擊倒柱數之和。
(3)若某一輪兩次滾球未擊倒全部十個柱,則本輪不再繼續滾球,該輪得分為這兩次
滾球擊倒的柱數之和。
總之,若—輪中一次滾球或兩次滾球擊倒十個柱,則本輪得分是本輪首次滾球開始的
連續三次滾球擊倒柱數之和(其中有一次或兩次不是本輪滾球)。若一輪內二次滾球擊倒柱
數不足十個,則本輪得分即為這兩次擊倒柱數之和。下面以執行個體說明如下(字元“/”表示擊倒當前球道上的全部的柱):
輪 1 2 3 4 5 6 7 8 9 10 11 12
擊球情況 / / / 72 9/ 81 8/ / 9/ / 8/
各輪得分 30 27 19 9 18 9 20 20 20 20
累計總分 30 57 76 85 103 112 132 152 172 192
現在請你編寫一個保齡球即時計分程式,用來計算和顯示某輪結束後的得分情況。若某輪的得分暫時無法算出,則該輪得分不顯示。
Input
輸入資料用檔案bowling.in,檔案內容僅有一行,為前若干輪滾球的情況,每輪滾球用一到兩個字元表示,每一個字元表示一次擊球,字元“/”表示擊倒當前球道上的全部的柱,否則用一個數字字元表示本次滾球擊倒的當前球道上的柱的數目,兩輪滾球之間用一個空白字元隔開。
如上例對應的輸入檔案內容為:/ / / 72 9/ 81 8/ / 9/ / 8/
Output
輸出到檔案bowling.out,共兩行,第一行為每輪得分,第二行為到當前輪為止的總得分。每個得分之間用一個空格隔開。
Sample Input
/ / / 72 9/ 81 8/ / 9/ / 8/
Sample Output
30 27 19 9 18 9 20 20 20 20
30 57 76 85 103 112 132 152 172 192
*/
#include < stdio.h >
#include < string .h >
#define MAX 21
int main( void )
{
char c,st[MAX];
int a[MAX] = { 0 },b[MAX] = { 0 };
int i,j,total = 0 ,t = 0 ,now = 0 ,temp;
while ( (c = getchar()) != ' ' )
{
if (c != ' ' )
st[ ++ t] = c;
}
for (i = 1 ,j = 1 ; i <= 10 ; i ++ )
{
if (st[j] == ' / ' )
{
now = 10 ;
if (st[j + 1 ] == ' / ' )
{
now += 10 ;
if (st[j + 2 ] == ' / ' )
now += 10 ;
else
now += st[j + 2 ] - ' 0 ' ;
}
else /* 考慮後面的性況是否是連續的 */
{
if (st[j + 2 ] == ' / ' )
now += 10 ;
else
now += st[j + 1 ] - ' 0 ' + st[j + 2 ] - ' 0 ' ; }
j += 1 ;
}
else
{
if (st[j + 1 ] == ' / ' )
{
if (st[j + 2 ] == ' / ' )
now = 20 ;
else
now = 10 + st[j + 2 ] - ' 0 ' ;
}
else
now = st[j] - ' 0 ' + st[j + 1 ] - ' 0 ' ;
j += 2 ;
}
total += now ;
a[i] = now ;
b[i] = total;
}
for (i = 1 ; i <= 10 ; i ++ )
printf( " %d " ,a[i]);
printf( " " );
for (i = 1 ; i <= 10 ; i ++ )
printf( " %d " ,b[i]);
printf( " " );
return 0 ;
}
#include < stdio.h >
#include < string .h >
#define MAX 21
int count( char ch)
{
if ( ch == ' / ' )
return 10 ;
else
return (ch - ' 0 ' );
}
int main( void )
{
char c,st[MAX];
int a[MAX] = { 0 },b[MAX] = { 0 };
int i,j,total = 0 ,t = 0 ,now = 0 ,temp;
while ( (c = getchar()) != ' ' )
{
if (c != ' ' )
st[ ++ t] = c;
}
for (i = 1 ,j = 1 ; i <= 10 ; i ++ )
{
if (st[j] == ' / ' )
{
now = 10 ;
if (st[j + 1 ] == ' / ' )
now += 10 + count(st[j + 2 ]) ;
else /* 考慮後面的性況是否是連續的 */
{
if (st[j + 2 ] == ' / ' )
now += 10 ;
else
now += count(st[j + 1 ]) + count(st[j + 2 ]) ;
}
j += 1 ;
}
else
{
if (st[j + 1 ] == ' / ' )
now = 10 + count(st[j + 2 ]);
else
now = count(st[j]) + count(st[j + 1 ]);
j