保龄球


打保龄球是用一个滚球去打击十个站立的柱,将柱击倒。

一局分十轮,每轮可滚球一次或多次,以击倒的柱数为依据计分。

一局得分为十轮得分之和,而每轮的得分不仅与本轮滚球情况有关,还可能与后续一两轮的滚球情况有关。即某轮某次滚球击倒的柱数不仅要计入本轮得分,还可能会计入前一两轮得分。具体的滚球击柱规则和计分方法如下:

  • 若某一轮的第一次滚球就击倒全部十个柱,则本轮不再滚球(若是第十轮则还需另加两次滚球,不妨称其为第十一轮和第十二轮,并不是所有的情况都需要滚第十一轮和第十二轮球)。该轮得分为本次击倒柱数 10 与以后两次滚球所击倒柱数之和。
  • 若某一轮的第一次滚球未击倒十个柱,则可对剩下未倒的柱再滚球一次。如果这两次滚球击倒全部十个柱,则本轮不再滚球(若是第十轮则还需另加一次滚球),该轮得分为这两次共击倒柱数 10 与以后一次滚球所击倒柱数之和。
  • 若某一轮两次滚球未击倒全部十个柱,则本轮不再继续滚球,该轮得分为这两次滚球击倒的柱数之和。

总之,若—轮中一次滚球或两次滚球击倒十个柱,则本轮得分是本轮首次滚球开始的连续三次滚球击倒柱数之和(其中有一次或两次不是本轮滚球)。若一轮内二次滚球击倒柱数不足十个,则本轮得分即为这两次击倒柱数之和。

下面以实例说明如下(字符“/”表示击倒当前球道上的全部的柱):

1
2
3
4
轮      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

现在请你编写一个保龄球实时计分程序,用来计算和显示结束后的得分情况

样例

1
/ / / 72 9/ 81 8/ / 9/ / 8/
1
192

试解

思路:先将所有数据输入存储起来,再去从前向后遍历 进行数据的处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include<iostream>
#include<vector>
#include<string>
using namespace std;

int score[12];
string record[12];

int main() {
//将输入记号存入record数组中 并记录record数组中数据个数len
int len = 0;
for (len = 0; cin >> record[len]; ++len);
//开始计算每轮得分 并存入score数组中
for (int i = 0; i < 10; ++i) {
if (record[i] == "/") {
if (record[i + 1] == "/") {
if (record[i + 2] == "/") score[i] = 30;
else score[i] = 20 + record[i + 2][0] - '0';
} else {
if (record[i + 1][1] == '/') score[i] = 20;
else score[i] = 10 + record[i + 1][0] - '0' + record[i + 1][1] - '0';
}
} else if (record[i][1] == '/') {
if (record[i + 1] == "/") score[i] = 20;
else score[i] = 10 + record[i + 1][0] - '0';
} else {
score[i] = record[i][0] - '0' + record[i][1] - '0';
}
}
for (int i = 0; i < 10; ++i) {
printf("score[%d] = %d\n", i, score[i]);
}
//计算总分sum
int sum = 0;
for (int i = 0; i < 10; ++i)
sum += score[i];
cout << sum << endl;
return 0;
}

image-20230225113210119

参考代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include<iostream>
using namespace std;

struct node {
char str[4];//每一局读入的字符数组(字符串)
int num1, num2;//num1为第一球得分 num2为两球的总分
int flag;//是否触发加分机制
};

node m[15];//记录比赛情况

int main() {
//1.录入得分情况 初始化数据
for (int i = 1; cin >> m[i].str; ++i) {
if (m[i].str[0] == '/') {
m[i].num1 = 10;
m[i].num2 = 10;
m[i].flag = 2;
} else if (m[i].str[1] == '/') {
m[i].num1 = m[i].str[0] - '0';
m[i].num2 = 10;
m[i].flag = 1;
} else {
m[i].num1 = m[i].str[0] - '0';
m[i].num2 = m[i].num1 + m[i].str[1] - '0';
}
}
//2.开始计算得分
int ans = 0;
for (int i = 1; i <= 10; ++i) {
ans += m[i].num2;
if (m[i].flag == 1) {
ans += m[i + 1].num1;
} else if (m[i].flag == 2){
if (m[i + 1].flag == 2) {
ans = ans + 10 + m[i + 2].num1;
} else {
ans += m[i + 1].num2;
}
}
}
cout << ans << endl;
return 0;
}