• zoj 2835 Magic Square(set)


    Magic Square

    Time Limit: 2 Seconds      Memory Limit: 65536 KB

    In recreational mathematics, a magic square of n-degree is an arrangement of n2 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
    分析:根据幻方矩阵,可以计算出行和(列和,对角线和)为总和/行数;
     1 #include <iostream>
     2 #include <cstdio>
     3 #include <set>
     4 using namespace std;
     5 int m[10][10];
     6 int main(){
     7     int n, i, j;
     8     int row_sum, col_sum;//行和,列和 
     9     int main_diagonal_sum, counter_diagonal_sum;//主对角线元素和,副对角线元素和 
    10     int sum;
    11     set<int> st;
    12     while(cin >> n){
    13         if(n == 0)
    14             break;
    15         st.clear();
    16         main_diagonal_sum = 0, counter_diagonal_sum = 0, sum = 0;
    17         for(i = 0; i < n; i++){
    18             for(j = 0; j < n; j++){
    19                 cin >> m[i][j];
    20                 sum += m[i][j];
    21                 st.insert(m[i][j]);
    22             }
    23         }
    24         if(st.size() != n * n){//很重要,矩阵中的数有可能重复,有重数的矩阵直接输出"No" 
    25             cout << "No" << endl;
    26             continue;
    27         }
    28         int aver = sum / n;
    29         //cout << aver << "a" << endl;
    30         for(i = 0; i < n; i++){
    31             row_sum = 0;
    32             col_sum = 0;
    33             for(j = 0; j < n; j++){
    34                 row_sum += m[i][j];
    35                 col_sum += m[j][i];
    36             }
    37             if(row_sum != aver || col_sum != aver){
    38                 cout << "No" << endl;
    39                 goto RL;
    40             }
    41         }
    42         for(i = 0; i < n; i++){
    43             main_diagonal_sum += m[i][i];
    44             counter_diagonal_sum += m[i][n - 1 - i];
    45         }
    46         if(main_diagonal_sum != aver || counter_diagonal_sum != aver){
    47             cout << "No" << endl;
    48             continue;
    49         }
    50         cout << "Yes" << endl;
    51         RL:
    52             continue;
    53     }
    54     return 0;
    55 }

    还有一种方法是将所有的和放到一个set集合,最后判断集合大小是不是1,若为1,则yes,否则no

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <set>
     4 using namespace std;
     5 int m[10][10];
     6 int main(){
     7     int n, i, j;
     8     int row_sum, col_sum;//行和,列和 
     9     int main_diagonal_sum, counter_diagonal_sum;//主对角线元素和,副对角线元素和 
    10     set<int> st;
    11     while(cin >> n){
    12         if(n == 0)
    13             break;
    14         st.clear();
    15         main_diagonal_sum = 0, counter_diagonal_sum = 0;
    16         for(i = 0; i < n; i++){
    17             for(j = 0; j < n; j++){
    18                 cin >> m[i][j];
    19                 st.insert(m[i][j]);
    20             }
    21         }
    22         if(st.size() != n * n){//很重要,矩阵中的数有可能重复,有重数的矩阵直接输出"No" 
    23             cout << "No" << endl;
    24             continue;
    25         }
    26         st.clear();
    27         for(i = 0; i < n; i++){
    28             row_sum = 0;
    29             col_sum = 0;
    30             for(j = 0; j < n; j++){
    31                 row_sum += m[i][j];
    32                 col_sum += m[j][i];
    33             }
    34             st.insert(row_sum);
    35             st.insert(col_sum);
    36         }
    37         for(i = 0; i < n; i++){
    38             main_diagonal_sum += m[i][i];
    39             counter_diagonal_sum += m[i][n - 1 - i];
    40         }
    41         st.insert(main_diagonal_sum);
    42         st.insert(counter_diagonal_sum);
    43         if(st.size() != 1)
    44             cout << "No" << endl;
    45         else
    46             cout << "Yes" << endl;
    47     }
    48     return 0;
    49 }
     
  • 相关阅读:
    4星|万维刚《你有你的计划,世界另有计划》:前物理学家的读书笔记,主要是社会科学领域的书
    3星|《耕作革命》:免耕、保留作物残茬、不同作物轮作的保护性农业,环保且高产
    2.5星|《逆商》:1997年出版的鸡汤,强调积极乐观面对逆境
    3星|《产品游戏化》:游戏类软件产品的宏观开发流程
    2星|曾仕强《人性管理》:故事会水平,像是没有学术背景的讲师
    3.5星|《是谁出的题这么难,到处都是正确答案》:​麦肯锡的经历,文艺妈妈的笔,温馨的父母与丈夫
    基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系。 根据验证过程,远程证书无效------解决方法
    XmlDocument.Load(url) 本地和http远程
    Windows服务启动进程----Cjwdev.WindowsApi.dll
    winform无需安装pdf阅读器打开pdf文件
  • 原文地址:https://www.cnblogs.com/qinduanyinghua/p/6530270.html
Copyright © 2020-2023  润新知