幻方验证,开始题意理解错了,以为n^2个数分布在1到n^2之间,WA了一次,后来发现并没有这个限制,只要互不相同就行了
#include<stdio.h>
int main()
{
int n, a[10][10], b[1001];
while (scanf("%d", &n), n)
{
int i, j, flag = 1, constant = 0;
for (i = 0; i < 1001; i++)
b[i] = 0;
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
{
scanf("%d", &a[i][j]);
if (!i)
constant += a[i][j];
if (b[a[i][j]] == 1)
flag = 0;
else
b[a[i][j]] = 1;
}
int sum;
for (i = 0; i < n && flag; i++)
{
sum = 0;
for (j = 0; j < n; j++)
sum += a[i][j];
if (sum != constant)
flag = 0;
}
for (j = 0; j < n && flag; j++)
{
sum = 0;
for (i = 0; i < n; i++)
sum += a[i][j];
if (sum != constant)
flag = 0;
}
sum = 0;
for (i = 0; i < n && flag; i++)
sum += a[i][i];
if (sum != constant)
flag = 0;
sum = 0;
for (i = 0; i < n && flag; i++)
sum += a[i][n - 1 - i];
if (sum != constant)
flag = 0;
printf(flag ? "Yes\n" : "No\n");
}
return 0;
}
强迫症突然发作了。。看这题能优化的空间比较大,只用做一次全部遍历就能判断是否幻方,因此对代码进行了最大程度简化。。以下是我能做到的极限了
#include<stdio.h>
#include<string.h>
int main()
{
int n, a[10][10], b[1001];
while (scanf("%d", &n), n)
{
int i, j, flag = 1, constant = 0, sum, sum1 = 0, sum2 = 0, s[10];
memset(s, 0, 10 * sizeof(int));
memset(b, 0, 1001 * sizeof(int));
for (i = 0; i < n; i++)
{
sum = 0;
for (j = 0; j < n; j++)
{
scanf("%d", &a[i][j]);
if (b[a[i][j]] == 1)
flag = 0;
else
b[a[i][j]] = 1;
constant = i ? constant : constant + a[i][j];
sum += a[i][j];
s[j] += a[i][j];
sum1 = i == j ? sum1 + a[i][j] : sum1;
sum2 = i + j == n - 1 ? sum2 + a[i][j] : sum2;
if (i == n - 1 && s[j] != constant)
flag = 0;
}
flag = sum == constant && flag ? 1 : 0;
}
flag = sum1 == constant && sum2 == constant && flag ? 1 : 0;
printf(flag ? "Yes\n" : "No\n");
}
return 0;
}