当先锋百科网

首页 1 2 3 4 5 6 7

问题 : 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 ;
}