模拟
不过需要一些简单的预处理,这样后边也就不至于硬算了…
预处理:
1.输入的时候我们可以把一行中的每n个数合并(求和),这样我们算每n*n个小格子就只需要每次加n个数就行了
2.输入的时候判断一下每行只能有1-m这些数,而且只能有一个
3.对列判断重复数这里提一下…
这个题测试点不太全
我输入
3 2 4 1
3 2 4 1
2 3 1 4
2 3 1 4
上面那个代码放到OJ居然是对的(我原先没对列判断)…
最下面那个代码才是是标准的、
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
int T;
scanf("%d",&T);
for(int _ = 0;_ < T;_++)
{
printf("Case #%d: ",_+1);
int n;
scanf("%d",&n);
int m = n*n;
int a[m][m];
int sum[m][m/n+1];
int he = (m+1)*m/2;
memset(sum,0,sizeof(sum));
int f = 0;
int sum_col[m] = {0};
for(int i=0;i<m;i++)
{
int pd[m+1] = {0};
int now_sum = 0;
for(int j=0;j<m;j++)
{
scanf("%d",&a[i][j]);
if(f)
continue;
if(a[i][j] <= 0 || a[i][j] > m)
{
f = 1;
continue;
}
else
sum[i][j/n] += a[i][j],now_sum += a[i][j];
if(pd[a[i][j]])
f = 1;
pd[a[i][j]] = 1;
sum_col[j] += a[i][j];
}
if(now_sum != he)
f = 1;
}
if(f)
printf("No\n");
else
{
for(int i=0;i<m;i+=n)//小方格
{
for(int j=0;j<n;j++)
{
int now = 0;
for(int k=0;k<n;k++)
now += sum[i+k][j];
if(now != he)
{
f = 1;
break;
}
}
if(f)
break;
}
if(f)
printf("No\n");
else//竖着的
{
for(int i=0;i<m;i++)
if(sum_col[i] != he)
{
f = 1;
break;
}
if(f)
printf("No\n");
else
printf("Yes\n");
}
}
}
return 0;
}
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
int T;
scanf("%d",&T);
for(int _ = 0;_ < T;_++)
{
printf("Case #%d: ",_+1);
int n;
scanf("%d",&n);
int m = n*n;
int a[m][m];
int sum[m][m/n+1];
int he = (m+1)*m/2;
memset(sum,0,sizeof(sum));
int f = 0;
int pd_col[m+1][m+1];//列的重复数判断
memset(pd_col,0,sizeof(pd_col));
for(int i=0;i<m;i++)
{
int pd[m+1] = {0};
for(int j=0;j<m;j++)
{
scanf("%d",&a[i][j]);
if(f)
continue;
if(a[i][j] <= 0 || a[i][j] > m)
{
f = 1;
continue;
}
else
sum[i][j/n] += a[i][j];
if(pd[a[i][j]] || pd_col[j][a[i][j]])
f = 1;
pd[a[i][j]] = 1;
pd_col[j][a[i][j]] = 1;
}
}
if(f)
printf("No\n");
else
{
for(int i=0;i<m;i+=n)//小方格
{
for(int j=0;j<n;j++)
{
int now = 0;
for(int k=0;k<n;k++)
now += sum[i+k][j];
if(now != he)
{
f = 1;
break;
}
}
if(f)
break;
}
if(f)
printf("No\n");
else
printf("Yes\n");
}
}
return 0;
}
/*
1
2
3 2 4 1
3 2 4 1
2 3 1 4
2 3 1 4
*/