L1-104 九宫格 - 团体程序设计天梯赛-练习集 (pintia.cn)
很基本的处理,但是很考察矩阵处理的基本功,尤其是在考试的时候,稍微思考不全面就会错
#include<bits/stdc++.h>
using namespace std;
int mp[10][10], a[10], b[10];
// mp 用于存储九宫格的数字
// a, b 用于检查每行和每列的数字是否重复
int main() {
int n;
cin >> n; // 输入九宫格的数量
for (int z = 1; z <= n; z++) { // 对每一个九宫格进行处理
int isLegal = 0; // isLegal 用于标记九宫格是否满足要求,0表示满足,1表示不满足
// 读取九宫格的数字
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= 9; j++) {
cin >> mp[i][j];
}
}
// 检查每行和每列的数字是否重复,并判断是否满足要求
for (int i = 1; i <= 9; i++) {
isLegal = 0; // 重置 isLegal
memset(a, 0, sizeof(a)); // 清零数组 a
memset(b, 0, sizeof(b)); // 清零数组 b
// 统计每行和每列的数字出现的次数
for (int j = 1; j <= 9; j++) {
a[mp[i][j]]++; // 统计每行的数字
b[mp[j][i]]++; // 统计每列的数字
}
// 检查每行和每列的数字是否只出现一次
for (int k = 1; k <= 9; k++) {
if (a[k] == 0 || b[k] == 0 || a[k] > 1 || b[k] > 1) //因为是九宫格 每个数字必须要填有且不能大于1 所以如果某个数字为0也是非法
{
isLegal = 1; // 如果有数字未出现或重复出现,则标记为不满足要求
break;
}
}
if (isLegal == 1) break; // 如果不满足要求,则退出循环,不再检查后续的行列
}
int isLegalBox = 0; // isLegalBox 用于标记九宫格的每个3x3宫格是否满足要求
// 检查每个3x3宫格的数字是否重复,并判断是否满足要求
for (int x = 1; x <= 7; x += 3) { // x, y 表示每个3x3宫格的左上角坐标
for (int y = 1; y <= 7; y += 3) {
memset(a, 0, sizeof(a)); // 清零数组 a
// 统计每个3x3宫格的数字出现的次数
for (int i = x; i < x + 3; i++)
{
for (int j = y; j < y + 3; j++)
{
a[mp[i][j]]++;
}
}
// 检查每个3x3宫格的数字是否只出现一次
for (int k = 1; k <= 9; k++)
{
if (a[k] == 0 || a[k] > 1)
{
isLegalBox = 1; // 如果有数字未出现或重复出现,则标记为不满足要求
break;
}
}
if (isLegalBox == 1) break; // 对于当前的宫格,如果不满足要求,则退出循环,不再检查后续的3x3宫格
}
}
// 输出结果,如果九宫格满足要求,则输出 1,否则输出 0
if (isLegal == 1 || isLegalBox == 1) cout << "0" << '\n';
else cout << "1" << '\n';
}
return 0; // 程序结束
}