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;
}