AcWing 703. 数独检查(传送门)
输入样例:
3
3
5 3 4 6 7 8 9 1 2
6 7 2 1 9 5 3 4 8
1 9 8 3 4 2 5 6 7
8 5 9 7 6 1 4 2 3
4 2 6 8 5 3 7 9 1
7 1 3 9 2 4 8 5 6
9 6 1 5 3 7 2 8 4
2 8 7 4 1 9 6 3 5
3 4 5 2 8 6 1 7 9
3
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
3
5 3 4 6 7 8 9 1 2
6 7 2 1 9 5 3 4 8
1 9 8 3 4 2 5 6 7
8 5 9 7 6 1 4 2 3
4 2 6 8 999 3 7 9 1
7 1 3 9 2 4 8 5 6
9 6 1 5 3 7 2 8 4
2 8 7 4 1 9 6 3 5
3 4 5 2 8 6 1 7 9
输出样例:
Case #1: Yes
Case #2: No
Case #3: No
思路分析:
很基础的一个模拟题,可以帮助理解一下数独,短时高效的敲出AC代码!
AC代码:
#include <iostream>
#include <set>
using namespace std;
int a[40][40];
set<int> s;
bool flag;
int n;
void fun() {
if (s.size() < n * n)
flag = false;
if (*s.begin() != 1 || *s.rbegin() != n * n)
flag = false;
s.clear();
}
int main() {
int t;
cin >> t;
for (int k = 1; k <= t; k++) {
cin >> n;
flag = true;
for (int i = 0; i < n * n; i++)
for (int j = 0; j < n * n; j++)
cin >> a[i][j];
// 检查每行
for (int i = 0; i < n * n; i++) {
for (int j = 0; j < n * n; j++) {
s.insert(a[i][j]);
}
fun();
}
// 检查每列
for (int j = 0; j < n * n; j++) {
for (int i = 0; i < n * n; i++) {
s.insert(a[i][j]);
}
fun();
}
int p = 0;
int q = 0;
// 检查每个子矩阵
for (int l = 1; l <= n * n; l++) {
for (int i = p; i < p + n; i++)
for (int j = q; j < q + n; j++)
s.insert(a[i][j]);
fun();
if(l % n != 0)
p += n;
else {
q += n;
p = 0;
}
}
cout << "Case #" << k << ": ";
if (flag)
cout << "Yes";
else
cout << "No";
cout << endl;
}
return 0;
}