28幻方

来源:互联网 发布:广联达软件下载教程 编辑:程序博客网 时间:2024/05/23 10:53
在娱乐性的数学里,一个度幻方共有n2个数字的排列,它们都是不同的整数,在一个方块中,个数字在所有行、所有列和所有对角线中的和都相同。例如,下图显示了一个使用了整数1~9 的3 度幻方。
    
给定一个填充好数字的方形,我们需要你来判断它是否是一个幻方。
2.输入描述
输入数据包含多个测试案例。
每个测试案例的第一行是一个整数 N(0 < < 10),表示该数字方形的度数,然后下面是行,每行有个正整数描述了这个数字方形。输入数据中的所有数字不会超过1000N=0 的测试案例表示输入的结束,不要处理它。
3.输出描述
对于每个测试案例,如果它是幻方,打印一个“Yes”在一行上,否则,打印“No”。
4.输入样例
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
5.输出样例
No
No
Yes
Yes 


#include "stdafx.h"#include<iostream>#include<fstream>#include<cmath>#include<set>using namespace std;int _tmain(int argc, _TCHAR* argv[]){ifstream fin("D:\\visual studio 2013 code\\test.txt");int mat[10][10];int line[10], column[10];int mdia, ndia;int mat_size;set<int>mat_s;while (fin >> mat_size){mat_s.clear();mdia = 0;ndia = 0;if (mat_size == 0) break;for (int i = 0; i < mat_size; i++){for (int j = 0; j < mat_size; j++){fin >> mat[i][j];}}for (int i = 0; i < mat_size; i++){for (int j = 0; j < mat_size; j++){mat_s.insert(mat[i][j]);}}if (mat_s.size() != pow(mat_size,2)){cout << "No" << endl;continue;}for (int i = 0; i < mat_size; i++){line[i] = 0;column[i] = 0;}for (int i = 0; i < mat_size; i++){for (int j = 0; j < mat_size; j++){line[i] += mat[i][j];column[j] += mat[i][j];if (i == j){mdia += mat[i][j];}if (i+j==mat_size-1){ndia += mat[i][j];}}}mat_s.clear();mat_s.insert(mdia);mat_s.insert(ndia);for (int i = 0; i < mat_size; i++){mat_s.insert(line[i]);mat_s.insert(column[i]);}if (mat_s.size() != 1){cout << "No" << endl;}else{cout << "Yes" << endl;}}/*int mat[10] = { 0 };for (int i = 0; i < 10; i++){cout << mat[i]<<endl;}mat[2] = 0;mat[10] = { 0 };cout << "**********" << endl;for (int i = 0; i < 10; i++){cout << mat[i]<<endl;}*/return 0;}



0 0