标签:
题目链接:
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