问题 : n阶幻方矩阵验证(数组)
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
hint:这里用到的算法有求每行每列的和,求主对角线副对角线的和;
#include<stdio.h>
int main()
{
int t,n,arr[][];
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=;i<n;i++)
{
for(int j=;j<n;j++)
{
scanf("%d",&arr[i][j]);
}
}
int mark=;
int stand_sum=,arrsum=;
for(int i=;i<n;i++)
stand_sum+=arr[][i];
/*求行的和*/
for(int i=;i<n;i++)
{
arrsum=;
for(int j=;j<n;j++)
{
arrsum+=arr[i][j];
}
if(stand_sum!=arrsum)
{
mark=;
goto loop;
}
}
/*求列的和,只需要将求行的和里的i,j互换就好*/
for(int i=;i<n;i++)
{
arrsum=;
for(int j=;j<n;j++)
{
arrsum+=arr[j][i];
}
if(stand_sum!=arrsum)
{
mark=;
goto loop;
}
}
/*求主对角线的和*/
arrsum=;
for(int i=,j=;i<n;i++,j++)
{
arrsum+=arr[i][j];
}
if(stand_sum!=arrsum)
{
mark=;
goto loop;
}
/*求副对角线的和*/
arrsum=;
for(int i=,j=n-;i<n&&j>=;i++,j--)
{
arrsum+=arr[i][j];
}
if(stand_sum!=arrsum)
{
mark=;
goto loop;
}
loop:;
if(mark==)
printf("yes\n");
else
printf("no\n");
}
return ;
}