你的位置:首页 > 信息动态 > 新闻中心
信息动态
联系我们

n阶幻方矩阵验证(数组)

2021/12/23 23:34:32

题目描述

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数组
		}
	}
}