AcWing 703. 数独检查
原题链接
简单
作者:
hai阿卢
,
2021-03-06 12:37:56
,
所有人可见
,
阅读 257
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
const int N = 50;
int a[N][N];
bool s[N];
vector<int> v[N];
int main()
{
int t;
cin >> t;
for(int p = 1; p <= t; p++)
{
bool flag = true;
int n;
cin >> n;
//输入并检查行
for(int i = 0; i < n * n; i++)
{
memset(s, 0, sizeof(s));
for(int j = 0; j < n * n; j++)
{
cin >> a[i][j];
if(a[i][j] > 0 && a[i][j] <= n * n)
s[a[i][j]] = true;
}
for(int k = 1; k <= n * n && flag; k++)
{
if(!s[k]) flag = false;
}
}
//检查列
for(int i = 0; i < n * n && flag; i ++)
{
memset(s, 0, sizeof(s));
for(int j = 0; j < n * n; j ++)
{
if(a[j][i] > 0 && a[j][i] <= n * n)
s[a[j][i]] = true;
}
for(int k = 1; k <= n * n && flag; k++)
{
if(!s[k]) flag = false;
}
}
//检查子矩阵
for(int x = 0; x < n * n && flag; x += n)
{
for(int y = 0; y < n * n; y += n)
{
memset(s, 0, sizeof(s));
for(int xi = 0; xi < n; xi++)
{
for(int yi = 0; yi < n; yi++)
{
if(a[x + xi][y + yi] > 0 && a[x + xi][y + yi] <= n * n)
s[a[x + xi][y + yi]] = true;
}
}
for(int k = 1; k <= n * n && flag; k++)
{
if(!s[k]) flag = false;
}
}
}
if(flag == true) printf("Case #%d: Yes\n", p);
else printf("Case #%d: No\n", p);
}
return 0;
}