保龄球
打保龄球是用一个滚球去打击十个站立的柱,将柱击倒。
一局分十轮,每轮可滚球一次或多次,以击倒的柱数为依据计分。
一局得分为十轮得分之和,而每轮的得分不仅与本轮滚球情况有关,还可能与后续一两轮的滚球情况有关。即某轮某次滚球击倒的柱数不仅要计入本轮得分,还可能会计入前一两轮得分。具体的滚球击柱规则和计分方法如下:
- 若某一轮的第一次滚球就击倒全部十个柱,则本轮不再滚球(若是第十轮则还需另加两次滚球,不妨称其为第十一轮和第十二轮,并不是所有的情况都需要滚第十一轮和第十二轮球)。该轮得分为本次击倒柱数 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 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() { int len = 0; for (len = 0; cin >> record[len]; ++len); 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]); } int sum = 0; for (int i = 0; i < 10; ++i) sum += score[i]; cout << sum << endl; return 0; }
|
参考代码
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; int flag; };
node m[15];
int main() { 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'; } } 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; }
|