洛谷 P1166 打保齡球
P1166 打保齡球
題目描述
打保齡球是用一個滾球去打擊十個站立的柱,將柱擊倒。一局分十輪,每輪可滾球一次或多次,以擊倒的柱數為依據計分。一局得分為十輪得分之和,而每輪的得分不僅與本輪滾球情況有關,還可能與後續一兩輪的滾球情況有關。即某輪某次滾球擊倒的柱數不僅要計入本輪得分,還可能會計入前一兩輪得分。具體的滾球擊柱規則和計分方法如下:
(1)若某一輪的第一次滾球就擊倒全部十個柱,則本輪不再滾球(若是第十輪則還需另加兩次滾球,不妨稱其為第十一輪和第十二輪,並不是所有的情況都需要滾第十一輪和第十二輪球)。該輪得分為本次擊倒柱數10與以後兩次滾球所擊倒柱數之和。
(2)若某一輪的第一次滾球未擊倒十個柱,則可對剩下未倒的柱再滾球一次。如果這兩次滾球擊倒全部十個柱,則本輪不再滾球(若是第十輪則還需另加一次滾球),該輪得分為這兩次共擊倒柱數 1010 與以後一次滾球所擊倒柱數之和。
(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
現在請你編寫一個保齡球實時計分程序,用來計算和顯示某輪結束後的得分情況。若某輪的得分暫時無法算出,則該輪得分不顯示。
輸入輸出格式
輸入格式:
僅有一行,為前若幹輪滾球的情況,每輪滾球用一到兩個字符表示,每一個字符表示一次擊球,字符“/”表示擊倒當前球道上的全部的柱,否則用一個數字字符表示本次滾球擊倒的當前球道上的柱的數目,兩輪滾球之間用一個空格字符隔開。
如上例對應的輸入文件內容為:/ / / 72 9/ 81 8/ / 9/ / 8/
輸出格式:
共兩行,第一行為每輪得分,第二行為到當前輪為止的總得分。每個得分之間用一個空格隔開。
輸入輸出樣例
輸入樣例#1: 復制/ / / 72 9/ 81 8/ / 9/ / 8/
輸出樣例#1: 復制
30 27 19 9 18 9 20 20 20 20
30 57 76 85 103 112 132 152 172 192
思路:模擬,就是比較麻煩,關鍵是要考慮清楚所有的情況,不要漏掉。
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; string s; int d[13]; int df[13][3]; bool y[13][3]; int zdf,l=1,zl=1; int main(){ getline(cin,s); memset(d,0,sizeof(d)); memset(y,0,sizeof(y)); memset(df,0,sizeof(df)); int x=s.length(); for(int i=0;i<x;i++){ if(s[i]==‘ ‘) continue; if(s[i]==‘/‘){ df[zl][l]=10-df[zl][l-1]; y[zl][l]=true; if(l==1){ zl++;continue; } } else{ df[zl][l]=s[i]-48; y[zl][l]=true; } if(l==2){ ++zl;l=1; } else ++l; } zl--; for(int i=1;i<=zl;i++){ if(df[i][1]==10){ if(!y[i+1][1]) break; if(df[i+1][1]==10&&(!y[i+2][1])) break; if(df[i+1][1]<10&&(!y[i+1][2])) break; d[i]=10+df[i+1][1]; if(df[i+1][1]==10) d[i]+=df[i+2][1]; else d[i]+=df[i+1][2]; } else{ if(!y[i][2]) break; if(df[i][1]+df[i][2]==10&&(!y[i + 1][1])) break; d[i]=df[i][1]+df[i][2]; if(d[i]==10) d[i]+=df[i+1][1]; } } for(int i=1;i<=zl;i++) { if(d[i]==0) break; cout<<d[i]<<‘ ‘; } puts("");int ans=0; for(int i=1;i<=zl;i++){ if(d[i]==0) break; ans+=d[i]; cout<<ans<<‘ ‘; } }
洛谷 P1166 打保齡球