题目描述
703数独问题
样例
#include <iostream>
#include <cstring>
#include <algorithm>
const int N = 40;
int n,m;
bool st[N];
int a[N][N];
using namespace std;
bool check_row(){
for(int i = 0; i < m; i++){//遍历每一行
memset(st, 0, sizeof st);
for(int j = 0; j < m; j++){
int t = a[i][j];
if(t < 0 || t > m) return false;
if(st[t]) return false;
st[t] = true;
}
}
return true;
}
bool check_col(){
for(int i = 0; i < m; i++){
memset(st, 0, sizeof st);
for(int j = 0; j < m; j++){
int t = a[j][i];
if(t < 0 || t > m)return false;
if(st[t]) return false;
st[t] = true;
}
}
return true;
}
bool check_rock(){
for(int x = 0; x < m ; x += n){
for(int y = 0; y < m; y += n){
memset(st, 0, sizeof st);
for(int dx = 0; dx < n; dx++){
for(int dy = 0; dy < n; dy++){
int t = a[x + dx][y + dy];
if(t < 0 || t > m)return false;
if(st[t]) return false;
st[t] = true;
}
}
}
}
return true;
}
int main(){
int T;
cin >> T;
for(int C = 1; C < T + 1; C++){
cin >> n;
m = n * n;
for(int i = 0; i < m; i++)
for(int j = 0; j < m; j++)
cin >> a[i][j];
if(check_row() && check_col() && check_rock()) printf("Case #%d: Yes\n", C);
else printf("Case #%d: No\n", C);
}
}