L1-8 刮刮彩票
分数 20
全屏浏览题目
切换布局
作者 DAI, Longao
单位 杭州百腾教育科技有限公司
“刮刮彩票”是一款网络游戏里面的一个小游戏。如图所示:
每次游戏玩家会拿到一张彩票,上面会有 9 个数字,分别为数字 1 到数字 9,数字各不重复,并以 3×3 的“九宫格”形式排布在彩票上。
在游戏开始时能看见一个位置上的数字,其他位置上的数字均不可见。你可以选择三个位置的数字刮开,这样玩家就能看见四个位置上的数字了。最后玩家再从 3 横、3 竖、2 斜共 8 个方向中挑选一个方向,方向上三个数字的和可根据下列表格进行兑奖,获得对应数额的金币。
数字合计 | 获得金币 | 数字合计 | 获得金币 |
---|---|---|---|
6 | 10,000 | 16 | 72 |
7 | 36 | 17 | 180 |
8 | 720 | 18 | 119 |
9 | 360 | 19 | 36 |
10 | 80 | 20 | 306 |
11 | 252 | 21 | 1,080 |
12 | 108 | 22 | 144 |
13 | 72 | 23 | 1,800 |
14 | 54 | 24 | 3,600 |
15 | 180 |
现在请你写出一个模拟程序,模拟玩家的游戏过程。
输入格式:
输入第一部分给出一张合法的彩票,即用 3 行 3 列给出 0 至 9 的数字。0 表示的是这个位置上的数字初始时就能看见了,而不是彩票上的数字为 0。
第二部给出玩家刮开的三个位置,分为三行,每行按格式 x y
给出玩家刮开的位置的行号和列号(题目中定义左上角的位置为第 1 行、第 1 列。)。数据保证玩家不会重复刮开已刮开的数字。
最后一部分给出玩家选择的方向,即一个整数: 1 至 3 表示选择横向的第一行、第二行、第三行,4 至 6 表示纵向的第一列、第二列、第三列,7、8分别表示左上到右下的主对角线和右上到左下的副对角线。
输出格式:
对于每一个刮开的操作,在一行中输出玩家能看到的数字。最后对于选择的方向,在一行中输出玩家获得的金币数量。
输入样例:
1 2 3
4 5 6
7 8 0
1 1
2 2
2 3
7
输出样例:
1
5
6
180
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
题目解析:
-
初始化和输入: 首先创建了一个二维数组
a
来存储彩票上的数字,以及一个一维数组kk
来标记哪些数字已经出现过。然后,从输入中读取彩票上的数字,并在kk
中标记这些数字。 -
处理初始可见数字: 查找了第一个没有在彩票上出现的数字(即
kk[flag]==0
的第一个flag
),并将其赋值给彩票上初始可见的位置(即a[i][j]==0
的位置)。int a[4][4]; vector<int> kk(100, 0); for(int i = 1; i <= 3; i++) for(int j = 1; j <= 3; j++) { cin >> a[i][j]; kk[a[i][j]] = 1; } int m,n; int count = 1; int flag;//0的部位填充什么 for(flag = 1;flag<=9;flag++) if(kk[flag]==0) break;
-
处理玩家刮开的数字: 对于玩家刮开的每一个位置,都从输入中读取该位置,并输出该位置上的数字。
for(int i = 1; i <= 3; i++){ cin >> m >> n; cout << a[m][n] << endl; }
-
计算和输出奖金: 最后,根据玩家选择的方向,计算了该方向上的数字之和,并根据这个和的值,输出了对应的奖金数量。计算金币部分:
int g; cin >> g; int sum = 0; // 计算横向、纵向、对角线上的数字和 if(g <= 3) { for(int i = 1; i <= 3; i++) sum += a[g][i]; } if(g >= 4 && g <= 6){ for(int i = 1; i <= 3; i++) sum += a[i][g - 3]; } if(g == 7) { sum = a[1][1] + a[2][2] + a[3][3]; } if(g == 8) sum = a[3][1] + a[2][2] + a[1][3]; // 输出金币奖励 // ...
金币奖励的输出部分:
if(sum==6) cout<<10000; if(sum==7) cout<<36; if(sum==8) cout<<720; if(sum==9) cout<<360; if(sum==10) cout<<80; if(sum==11) cout<<252; if(sum==12) cout<<108; if(sum==13) cout<<72; if(sum==14) cout<<54; if(sum==15) cout<<180; if(sum==16) cout<<72; if(sum==17) cout<<180; if(sum==18) cout<<119; if(sum==19) cout<<36; if(sum==20) cout<<306; if(sum==21) cout<<1080; if(sum==22) cout<<144; if(sum==23) cout<<1800; if(sum==24) cout<<3600;
整体代码实现:
#include<bits/stdc++.h> using namespace std; int main() { int a[4][4]; vector<int >kk(100,0); for(int i = 1;i<=3;i++) for(int j = 1;j<=3;j++) { cin>>a[i][j]; kk[a[i][j]] = 1; } int m,n; int count = 1; int flag;//0的部位填充什么 for(flag = 1;flag<=9;flag++) if(kk[flag]==0) break; for(int i = 1;i<=3;i++) for(int j = 1;j<=3;j++) { if(a[i][j]==0) a[i][j] = flag; } for(int i = 1;i<=3;i++){ cin>>m>>n; cout<<a[m][n]<<endl; } int g; cin>>g; int sum = 0 ; if(g<=3) { for(int i = 1;i<=3;i++) sum+=a[g][i]; } if(g>=4&&g<=6){ for(int i =1;i<=3;i++) sum+=a[i][g-3]; } if(g==7) { sum = a[1][1]+a[2][2]+a[3][3]; } if(g==8) sum = a[3][1]+a[2][2]+a[1][3]; if(sum==6) cout<<10000; if(sum==7) cout<<36; if(sum==8) cout<<720; if(sum==9) cout<<360; if(sum==10) cout<<80; if(sum==11) cout<<252; if(sum==12) cout<<108; if(sum==13) cout<<72; if(sum==14) cout<<54; if(sum==15) cout<<180; if(sum==16) cout<<72; if(sum==17) cout<<180; if(sum==18) cout<<119; if(sum==19) cout<<36; if(sum==20) cout<<306; if(sum==21) cout<<1080; if(sum==22) cout<<144; if(sum==23) cout<<1800; if(sum==24) cout<<3600; return 0; }
题目易错点总结:
-
边界条件和特殊情况: 需要正确处理边界条件和特殊情况,例如数字的范围、位置的范围、方向的选择等。如果没有正确处理这些情况,可能会导致程序错误或者得到错误的结果。
-
在处理彩票上的数字和玩家刮开的位置时,需要确保正确地更新和使用这些信息。例如,需要正确地标记和使用已经刮开的位置,以及正确地计算和使用数字的和。