洛谷P1166 打保龄球(模拟)

题目描述

打保龄球是用一个滚球去打击十个站立的柱,将柱击倒。一局分十轮,每轮可滚球一次或多次,以击倒的柱数为依据计分。一局得分为十轮得分之和,而每轮的得分不仅与本轮滚球情况有关,还可能与后续一两轮的滚球情况有关。即某轮某次滚球击倒的柱数不仅要计入本轮得分,还可能会计入前一两轮得分。具体的滚球击柱规则和计分方法如下:

(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

花了半天去理解题意…意思是说给你一个选手的滚球情况,打出他当前的成绩(坑了我不知道多少发 )
简单的说这题就是一个模拟(我才不是因为懒才找模拟题写的 )思路也很简单,对每一轮进行以下几个判断就行啦:

  1. 首先判断有没有在两次滚球之内把十个柱子滚完(判断有没有’/’);
  2. 如果滚完了(有’/’),在下一轮或下下轮找可以加的得分(如果三次滚球机会没用完,就不能输出得分);
  3. 如果没有滚完(没有’/’),判断当前轮有没有滚两次球(字符串长度是否为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;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,以下是一个简单的打保龄球的C语言程序设计: ```c #include <stdio.h> int main() { int score[10]; // 存储每一局的分数 int total_score = 0; // 总分数 int i, j; // 输入每一局的分数 for (i = 0; i < 10; i++) { printf("请输入第%d局的分数:", i+1); scanf("%d", &score[i]); } // 计算总分数 for (i = 0; i < 10; i++) { total_score += score[i]; // 如果是第10局,则考虑加赛的情况 if (i == 9) { if (score[i] == 10) { // 如果第10局是全中,则可以再投两次 printf("请再投一次:"); scanf("%d", &j); total_score += j; printf("请再投一次:"); scanf("%d", &j); total_score += j; } else if (score[i] + score[i-1] == 10) { // 如果第10局是补中,则可以再投一次 printf("请再投一次:"); scanf("%d", &j); total_score += j; } } else { if (score[i] == 10) { // 如果这一局是全中,则加上下两局的分数 total_score += score[i+1]; total_score += score[i+2]; } else if (score[i] + score[i+1] == 10) { // 如果这一局是补中,则加上下一局的第一次投的分数 total_score += score[i+2]; } } } printf("总分数为:%d", total_score); return 0; } ``` 这个程序会要求用户输入每一局的分数,然后计算总分数。如果最后一局是全中,则会让用户再投两次;如果是补中,则会让用户再投一次。注意,这个程序没有做输入合法性的检查,实际使用时需要加上。 ### 回答2: 保龄球是一种有趣的运动,我们可以用C语言来编写一个简单的保龄球程序。首先,我们需要定义一些变量来表示比赛的相关信息,比如玩家的姓名,每轮得分等等。 首先,我们可以定义一个结构体来存储玩家的姓名和每轮的得分: ```c struct Player { char name[50]; int scores[10]; }; ``` 然后,我们可以定义一个函数来计算每轮的得分。根据保龄球规则,如果在一轮中击倒了全部的10个瓶,那么这一轮的得分就是10,并且这一轮的得分会加上接下来两轮中每击倒瓶的数量。否则,如果在第一轮中就击倒了全部的瓶,那么这一轮的得分是10加上下一轮中击倒瓶的数量。如果未击倒全部瓶,得分就是本轮中击倒的瓶数。 ```c int calculateScore(int round, int knockedPins) { int score = knockedPins; if (round < 9) { if (knockedPins == 10) { score += knockedPins // 加上下两轮的得分 } else { score += knockedPins + knockedPins // 加上下一轮的得分 } } return score; } ``` 接下来,我们可以编写主函数来实现整个游戏的逻辑。首先,我们可以创建一个玩家数组来存储多个玩家的信息。然后,我们可以使用循环来模拟每一轮的比赛过程,并根据玩家的输入来获取每一轮的得分。最后,我们可以计算每个玩家的总得分并输出结果。 ```c #include <stdio.h> int main() { int numOfPlayers; printf("请输入参与比赛的玩家数量:"); scanf("%d", &numOfPlayers); struct Player players[numOfPlayers]; for (int i = 0; i < numOfPlayers; i++) { printf("请输入玩家%d的姓名:", i+1); scanf("%s", players[i].name); for (int j = 0; j < 10; j++) { printf("请输入玩家%d第%d轮的得分:", i+1, j+1); scanf("%d", &players[i].scores[j]); } } for (int i = 0; i < numOfPlayers; i++) { int totalScore = 0; for (int j = 0; j < 10; j++) { totalScore += calculateScore(j, players[i].scores[j]); } printf("玩家%s的总得分为:%d\n", players[i].name, totalScore); } return 0; } ``` 这样,我们就完成了一个简单的保龄球C语言程序。用户可以输入参与比赛的玩家数量以及每个玩家每轮的得分,程序会计算每个玩家的总得分并输出结果。当然,这只是一个简单的示例,实际的保龄球程序可以更加复杂和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值