分析
暴力判断。
在区块监测点(i%n==0 && j%n==0)上查看该区块所有数字出现的情况。
C++ 代码
#include<bits/stdc++.h>
using namespace std;
const int N = 1e3+10;
int g[N][N],T,n,block[N];
bool col[N][N],row[N][N]; //判断该列该行上的这个数是否是惟一的
int main()
{
ios::sync_with_stdio(false);
cin>>T;
for(int k=1;k<=T;k++)
{
cin>>n;
memset(col,0,sizeof col);
memset(row,0,sizeof row);
int flag=0;
for(int i=1;i<=n*n;i++)
{
for(int j=1;j<=n*n;j++)
{
cin>>g[i][j];
if(g[i][j]>n*n) flag=1;
if(!col[g[i][j]][j]) col[g[i][j]][j]=true;
else flag=1;
if(!row[g[i][j]][i]) row[g[i][j]][i]=true;
else flag=1;
if(i%n==0 && j%n==0) //当行列正好整除n时,检测以这个点的左上角的矩阵
{
memset(block,0,sizeof block);
for(int p=i;p>i-n;p--)
{
if(flag) break;
for(int q=j;q>j-n;q--)
{
block[g[p][q]]++;
if(block[g[p][q]]>1) //一个数出现一次以上,判断矩阵有问题,直接false
{
flag=1;
break;
}
}
}
}
}
}
cout<<"Case #"<<k<<": ";
if(flag==1) cout<<"No"<<endl;
else cout<<"Yes"<<endl;
}
return 0;
}