L1-072 刮刮彩票 (20 分)

每次游戏玩家会拿到一张彩票,上面会有 9 个数字,分别为数字 1 到数字 9,数字各不重复,并以 3×3 的“九宫格”形式排布在彩票上。

在游戏开始时能看见一个位置上的数字,其他位置上的数字均不可见。你可以选择三个位置的数字刮开,这样玩家就能看见四个位置上的数字了。最后玩家再从 3 横、3 竖、2 斜共 8 个方向中挑选一个方向,方向上三个数字的和可根据下列表格进行兑奖,获得对应数额的金币。
数字合计 	获得金币 	数字合计 	获得金币6 	10,000 	16 	727 	36 	17 	1808 	720 	18 	1199 	360 	19 	3610 	80 	20 	30611 	252 	21 	1,08012 	108 	22 	14413 	72 	23 	1,80014 	54 	24 	3,60015 	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

思路:

建一个数组,然后按题目要求进行操作,我建成了一个结构体,顺便标记了一下看得见的数字和看不见的数字,属于多此一举了,哈哈。

#include<iostream>

using namespace std;

typedef struct node {
	int data;
	bool flag = false;
}node;

void repair(node (*caipiao)[4]) {
	int flag[10],x,y;
	for (int i = 0; i < 10; i++) {
		flag[i] = 0;
	}
	for (int i = 1; i < 4; i++) {
		for (int j = 1; j < 4; j++) {
			if (caipiao[i][j].data == 0) {
				x = i;
				y = j;
			}
			flag[caipiao[i][j].data] += 1;
		}
	}
	for (int i = 1; i < 10; i++) {
		if (flag[i] == 0) {
			caipiao[x][y].data = i;
			break;
		}
	}
	return;
}

void print(node(*caipiao)[4],int oper) {
	int sum = 0;
	int win[19] = { 10000,36,720,360,80,252,108,72,54,180,72,180,119,36,306,1080,144,1800,3600 };
	if (oper <= 3) {
		for (int i = 1; i < 4; i++) {
			sum += caipiao[oper][i].data;
		}
	}
	else if (oper <= 6) {
		for (int i = 1; i < 4; i++) {
			sum += caipiao[i][oper-3].data;
		}
	}
	else if (oper == 7) {
		sum = caipiao[1][1].data + caipiao[2][2].data + caipiao[3][3].data;
	}
	else if (oper == 8) {
		sum = caipiao[1][3].data + caipiao[2][2].data + caipiao[3][1].data;
	}
	cout << win[sum - 6];
}

int main() {
	node caipiao[4][4];
	for (int i = 1; i < 4; i++) {
		for (int j = 1; j < 4; j++) {
			cin >> caipiao[i][j].data;
		}
	}
	repair(caipiao);//补全0处的数字
	for (int i = 0; i < 3; i++) {
		int x, y;
		cin >> x >> y;
		caipiao[x][y].flag=true;
		cout << caipiao[x][y].data << endl;
	}
	int oper;
	cin >> oper;
	print(caipiao, oper);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值