AcWing 703. 数独检查
原题链接
简单
作者:
Value
,
2021-03-04 13:08:28
,
所有人可见
,
阅读 383
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int N = 10;
int a[N * N][N * N];
bool st[N * N];
bool check(int n){
int m = n * n;
// 检查行
for(int i = 0; i < m; i ++ ){
memset(st, false, sizeof st);
for(int j = 0; j < m; j ++ ){
// 检查数字范围
if(a[i][j] <= 0 || a[i][j] > m) return false;
if(st[a[i][j]]) return false;
st[a[i][j]] = true;
}
}
// 检查列
for(int i = 0; i < m; i ++ ){
memset(st, false ,sizeof st);
for(int j = 0; j < m; j ++ ){
if(a[j][i] <= 0 || a[j][i] > m) return false;
if(st[a[j][i]]) return false;
st[a[j][i]] = true;
}
}
// // 检查方格
for(int i = 0; i < m; i += n ){
for(int j = 0; j < m; j += n){
memset(st, false, sizeof st);
// 确认大方格 i --> i + n, j --> j + n
for(int l = i; l < i + n; l ++ ){
for(int r = j; r < j + n; r ++ ){
if(st[a[l][r]]) return false;
st[a[l][r]] = true;
}
}
}
}
return true;
}
int main(){
int T; cin >> T;
for(int k = 1; k <= T; k ++ ){
int n; cin >> n;
for(int i = 0; i < n * n; i ++ ){
for(int j = 0; j < n * n; j ++ ){
scanf("%d", &a[i][j]);
}
}
printf("Case #%d: %s\n", k, check(n) ? "Yes" : "No");
}
return 0;
}