In recreational mathematics, a magic square of n-degree is an arrangement of n 2 numbers, distinct integers, in a square, such that the n numbers in all rows, all columns, and both diagonals sum to the same constant. For example, the picture below shows a 3-degree magic square using the integers of 1 to 9.
Given a finished number square, we need you to judge whether it is a magic square.
Input
The input contains multiple test cases.
The first line of each case stands an only integer N (0 < N < 10), indicating the degree of the number square and then N lines follows, with N positive integers in each line to describe the number square. All the numbers in the input do not exceed 1000.
A case with N = 0 denotes the end of input, which should not be processed.
Output
For each test case, print "Yes" if it's a magic square in a single line, otherwise print "No".
Sample Input
2 1 2 3 4 2 4 4 4 4 3 8 1 6 3 5 7 4 9 2 4 16 9 6 3 5 4 15 10 11 14 1 8 2 7 12 13 0
Sample Output
No No Yes Yes
Author: JIANG, Hao
Source: Zhejiang University Local Contest 2007
分析:
比较简单的题。
题意:
给定一个数字n和n*n的矩阵,判断矩阵是不是n度(阶)幻方(横竖斜的和都相等,且数字不能重复)。若是输出yes,否输出no。
分两步判断:先判断是否和相等,再判断数字是否重复就可以了。
ac代码:
#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=11;
int a[maxn][maxn];
int num[1001];
int sum[2*maxn+5];
int main()
{
int n,i,j,k;
while(scanf("%d",&n)&&n)
{
//int sum=0;
memset(sum,0,sizeof(sum));
memset(num,0,sizeof(num));
//int c=0;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
num[a[i][j]]++;//判断数字是否有重复的依据
sum[i]+=a[i][j];//保存每一行的和
sum[j+n]+=a[i][j];//保存每一列的和
//sum[2*n-1]+=a[i][i];
//sum[2*n]+=a[i][n-i-1];
}
for(i=0;i<n;i++)//对角线单独处理
{
sum[2*n]+=a[i][i];
sum[2*n+1]+=a[i][n-i-1];
}
//for(i=0;i<=2*n+1;i++)
// printf("%d ",sum[i]);
int t=sum[0];
for(i=0;i<=2*n+1;i++)
{
if(sum[i]!=t)
break;
}
for(j=0;j<=1000;j++)
{
if(num[j]>1)
break;
}
if(i==2*n+2&&j==1001)
printf("Yes\n");
else printf("No\n");
}
return 0;
}