标签:
题目链接:
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1835
题目大意:
给你一个N阶的矩阵,判断是不是N阶幻方。其中使用的数字不一定是1~N^2,但是
数字一定不能有重复的。
解题思路:
根据幻方的定义,遍历判断下所有横行、竖行、斜行的和是否相等,并且用Flag[]数组
来判断是否有重复数字存在。
AC代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
int Map[20][20],Sum[40],Flag[1100];
int Judge(int N)
{
memset(Sum,0,sizeof(Sum));
memset(Flag,0,sizeof(Flag));
for(int i = 0; i < N; ++i)
for(int j = 0; j < N; ++j)
{
if(!Flag[Map[i][j]])
Flag[Map[i][j]] = 1;
else
return 0;
}
for(int i = 0; i < N; ++i)
{
for(int j = 0; j < N; ++j)
Sum[i] += Map[i][j];
}
for(int i = 0; i < N; ++i)
{
for(int j = 0; j < N; ++j)
Sum[i+N] += Map[j][i];
}
for(int i = 0; i < N; ++i)
Sum[N+N] += Map[i][i];
for(int i = 0; i < N; ++i)
Sum[N+N+1] += Map[i][N-1-i];
int tmp = Sum[0];
for(int i = 0; i <= 2*N+1; ++i)
if(Sum[i] != tmp)
return 0;
return 1;
}
int main()
{
int N;
while(~scanf("%d",&N) && N)
{
for(int i = 0; i < N; ++i)
for(int j = 0; j < N; ++j)
scanf("%d",&Map[i][j]);
if(Judge(N))
printf("Yes\n");
else
printf("No\n");
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/lianai911/article/details/47832977