题目描述
n阶幻方矩阵是指将1,2,3,...,n²数字填入n*n矩阵中,每行和,每列和,两条对角线的和均相等。给定n阶矩阵,验证是否n阶幻方矩阵。
输入
测试次数t
每组测试数据为:矩阵大小n,后跟n*n的矩阵数据。
输出
对每组测试数据,输出判定结果,YES或NO
输入样例
3
3
8 1 6
3 5 7
4 9 2
4
1 2 15 16
12 14 3 5
13 7 10 4
8 11 6 9
3
1 2 3
4 5 6
7 8 9
输出样例
YES
YES
NO
#include <stdio.h>
#define maxn 100
int main()
{
int m, n;
int i, j, k, h;
int flag;
int a[maxn][maxn], b[maxn], count[maxn] = {0};
scanf("%d", &m);
for(k=1;k<=m;k++)
{
scanf("%d", &n);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%d", &a[i][j]); //输入数组
}
}
h = 0;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
b[h] = a[i][j]; //将二维数组转为一维数组方便后续操作
h++;
}
}
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
if(b[i] == b[j]) //判断数组中的每个数是否都不相等
{
flag = 1;
}
}
if(flag == 1)
break;
}
if(flag != 1)
{
h = 0;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
count[h] += a[i][j]; //横排
}
h++;
}
for(j=0;j<n;j++)
{
for(i=0;i<n;i++)
{
count[h] += a[i][j]; //竖排
}
h++;
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(i == j)
{
count[h] += a[i][j]; //主对角线
}
}
}
h++;
for(i=0,j=n-1;i<n;i++,j--)
{
count[h] += a[i][j]; //副对角线
}
h++;
for(i=1;i<h;i++)
{
if(count[0] != count[i]) //判断各和是否相等
flag = 1;
else flag = 0;
}
}
if(flag == 1)
printf("NO\n");
else if(flag == 0)
printf("YES\n");
for(i=0;i<h;i++)
{
count[i] = 0; //初始化count数组
}
}
}