AT_abc157_b [ABC157B] Bingo 的题解

该文章提供了一个Bingo游戏的解决方案,玩家拥有3x3的卡片,主持人报出一系列数字。程序通过标记匹配的数字,判断在所有数字报完后,是否有行、列或对角线上的三个数字被标记,从而确定是否达成Bingo。代码示例分别使用了一维和二维数组来实现这一逻辑。
摘要由CSDN通过智能技术生成

AT_abc157_b [ABC157B] Bingo 的题解

洛谷传送门
AT传送门

题目大意

你是游戏的一个玩家。你有一张 3 × 3 3 \times 3 3×3 网格的 Bingo 卡。从上往下第 i i i 行和从左往下第 j j j 列的方格包含数字 A i , j A_{i,j} Ai,j。主持人将报出 N N N 个数字 b 1 b_1 b1, b 2 b_2 b2, ⋯ \cdots b N b_N bN。如果我们的 Bingo 卡包含这些数字中的一些,我们将在表上标记它们。确定当 N N N 个数字被报完时,我们是否有一个 Bingo,也就是说,表上会有三个标记的数字在同一行、一列或对角线上。如果有就输出 Yes,没有就输出 No

思路

因为只有 3 × 3 3 \times 3 3×3,所以,我们可以用一个一维数组或者二维数组。然后,在输出的 n n n 个数中,有相同的就打上一个标记。最后再判断表上的三个标记数字是否在同一行同一列或对角线上。

代码

一维数组

#include <bits/stdc++.h>
using namespace std;
int n, a[10], b[105];
bool flag, x[10];
int main() {
	ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); // 没啥意义的优化 
	for (int i = 1; i <= 9; i ++) {
		cin >> a[i]; // 输入 
	}
	cin >> n;
	for (int i = 1; i <= n; i ++) {
		cin >> b[i];
		for (int j = 1; j <= 9; j ++) {
			if (b[i] == a[j]) {
				x[j] = 1; // 判断是否相同,是就打上标记 
			}
		}
	}
	if ((x[1] && x[2] && x[3]) || (x[4] && x[5] && x[6]) || (x[7] && x[8] && x[9])) { //行 
		flag = 1;
	}
	if ((x[1] && x[4] && x[7]) || (x[2] && x[5] && x[8]) || (x[3] && x[6] && x[9])) { // 列 
		flag = 1;
	}
	if ((x[1] && x[5] && x[9]) || (x[3] && x[5] && x[7])) { //对角线 
		flag = 1;
	} 
	puts (flag ? "Yes" : "No");
	return 0;
}

二维数组

#include <bits/stdc++.h>
using namespace std;
int n, a[4][4], b[105];
bool flag, x[4][4];
int main() {
	ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); // 没啥意义的优化 
	for (int i = 1; i <= 3; i ++) {
		for (int j = 1; j <= 3; j ++) {
			cin >> a[i][j]; // 输入 
		}
	}
	cin >> n;
	for (int i = 1; i <= n; i ++) {
		cin >> b[i];
		for (int j = 1; j <= 3; j ++) {
			for (int k = 1; k <= 3; k ++) {
				if (b[i] == a[j][k]) {
					x[j][k] = 1; // 判断是否相同,是就打上标记 
				}
			}
		
		}
	}
	if ((x[1][1] && x[1][2] && x[1][3]) || (x[2][1] && x[2][2] && x[2][3]) || (x[3][1] && x[2][3] && x[3][3])) { //行 
		flag = 1;
	}
	if ((x[1][1] && x[2][1] && x[3][1]) || (x[1][2] && x[2][2] && x[2][3]) || (x[1][3] && x[2][3] && x[3][3])) { // 列 
		flag = 1;
	}
	if ((x[1][1] && x[2][2] && x[3][3]) || (x[1][3] && x[2][2] && x[3][1])) { //对角线 
		flag = 1;
	} 
	puts (flag ? "Yes" : "No");
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值