题目描述
打保龄球是用一个滚球去打击十个站立的柱,将柱击倒。一局分十轮,每轮可滚球一次或多次,以击倒的柱数为依据计分。一局得分为十轮得分之和,而每轮的得分不仅与本轮滚球情况有关,还可能与后续一两轮的滚球情况有关。即某轮某次滚球击倒的柱数不仅要计入本轮得分,还可能会计入前一两轮得分。具体的滚球击柱规则和计分方法如下:
(1)若某一轮的第一次滚球就击倒全部十个柱,则本轮不再滚球(若是第十轮则还需另加两次滚球,不妨称其为第十一轮和第十二轮,并不是所有的情况都需要滚第十一轮和第十二轮球)。该轮得分为本次击倒柱数10与以后两次滚球所击倒柱数之和。
(2)若某一轮的第一次滚球未击倒十个柱,则可对剩下未倒的柱再滚球一次。如果这两次滚球击倒全部十个柱,则本轮不再滚球(若是第十轮则还需另加一次滚球),该轮得分为这两次共击倒柱数101010与以后一次滚球所击倒柱数之和。
(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 19
花了半天去理解题意…意思是说给你一个选手的滚球情况,打出他当前的成绩(坑了我不知道多少发 )
简单的说这题就是一个模拟(我才不是因为懒才找模拟题写的 )思路也很简单,对每一轮进行以下几个判断就行啦:
- 首先判断有没有在两次滚球之内把十个柱子滚完(判断有没有’/’);
- 如果滚完了(有’/’),在下一轮或下下轮找可以加的得分(如果三次滚球机会没用完,就不能输出得分);
- 如果没有滚完(没有’/’),判断当前轮有没有滚两次球(字符串长度是否为2),没有的话同样不能输出成绩.
思路还是很清晰的,下面放上代码
ACCODE
#include <iostream>
#include <algorithm>
using namespace std;
int ans[15];//记录本轮得分的数组
int ans1[15];//前缀和数组
int flag[15];//标识能否输出答案
string s[15];
int serch(int i)
{
for(int j=0;j<s[i].size();j++)
{
if(s[i][j]=='/')
return j+1;
}
return 0;
}//判断是否存在'/'
int getnum(int i,int len)
{
int ans=0;
int k=s[i].size();
for(int j=0;j<min(k,len);j++)//防越界
{
if(s[i][j]=='/')
ans=10;
else
ans+=(s[i][j]-'0');
}
return ans;
}
int main()
{
int len=0;
while(cin>>s[len++]);
for(int i=0;i<10;i++)
{
int k=3;
if(s[i]=="")
break;
if(serch(i))
{
ans[i]+=10;
k-=s[i].size();
if(k>0)
{
ans[i]+=getnum(i+1,k);
k-=s[i+1].size();
}//加上下次可以得到的分
if(k>0)
{
ans[i]+=getnum(i+2,k);
k-=s[i+2].size();
}////加上下下次可以得到的分
if(k<=0)
flag[i]=1;//可以输出的分
}
else
{
ans[i]=getnum(i,s[i].size());
if(s[i].size()==2)
flag[i]=1;
}
}
for(int i=0;i<10;i++)
{
if(flag[i])
cout<<ans[i]<<" ";
}
cout<<endl;
ans1[0]=ans[0];
for(int i=1;i<10;i++)
ans1[i]=ans1[i-1]+ans[i];
for(int i=0;i<10;i++)
{
if(flag[i])
cout<<ans1[i]<<" ";
} //写的好丑...
return 0;
}