zoukankan      html  css  js  c++  java
  • 蓝桥杯 九宫幻方(全排列)

    题目描述
    小明最近在教邻居家的小朋友小学奥数,而最近正好讲述到了三阶幻方这个部分,三阶幻方指的是将1~9不重复的填入一个3*3的矩阵当中,使得每一行、每一列和每一条对角线的和都是相同的。

    三阶幻方又被称作九宫格,在小学奥数里有一句非常有名的口诀:“二四为肩,六八为足,左三右七,戴九履一,五居其中”,通过这样的一句口诀就能够非常完美的构造出一个九宫格来。

    4 9 2
    3 5 7
    8 1 6


    有意思的是,所有的三阶幻方,都可以通过这样一个九宫格进行若干镜像和旋转操作之后得到。现在小明准备将一个三阶幻方(不一定是上图中的那个)中的一些数抹掉,交给邻居家的小朋友来进行还原,并且希望她能够判断出究竟是不是只有一个解。

    而你呢,也被小明交付了同样的任务,但是不同的是,你需要写一个程序~
    输入
    输入仅包含单组测试数据。
    每组测试数据为一个3*3的矩阵,其中为0的部分表示被小明抹去的部分。
    对于100%的数据,满足给出的矩阵至少能还原出一组可行的三阶幻方。
    输出
    如果仅能还原出一组可行的三阶幻方,则将其输出,否则输出“Too Many”(不包含引号)。
    样例输入
    0 7 2
    0 5 0
    0 3 0
    样例输出
    6 7 2
    1 5 9
    8 3 4
    提示
    笨笨有话说:
    我最喜欢这类题目了。既然九宫幻方一共也没有多少,我就不辞辛劳地一个一个写出来好了。
    也不能太过分,好歹用个数组。
     
     
     
     
     
     
     
    思路:把这九个数字当做一维数组b[9]输入,然后对数字1-9进行枚举全排列a[9], 当b[i]不为0的情况下,a[i]与b[i]对应相等时,
          并且数组a满足九宫幻方的特点时,计数次数cnt +1,并把a[]保存到结果数组result[]中。
    注意:由于此处只用到了数组中的部分数字,所以需要考虑对局面进行判重,但是考虑到本题的实际情况,所以并不需要判重。
     
     1 #include<iostream>
     2 #include<cstring>
     3 #include<algorithm>
     4 
     5 using namespace std;
     6 
     7 int a[9] = {1,2,3,4,5,6,7,8,9};    // 进行枚举的全排列数组 
     8 int b[9];    // 一开始输入的3×3数组 
     9 int result[9];    // 保存结果的数组 
    10 
    11 int main()
    12 {
    13     for(int i = 0; i < 9; ++i)
    14             cin >> b[i];
    15             
    16     int cnt = 0;
    17     do
    18     {
    19         int flag = 1;
    20         for(int i = 0; i < 9; ++i)
    21         {
    22             if(b[i] != 0)
    23             {
    24                 if(a[i] != b[i])
    25                 {
    26                     flag = 0;
    27                     break;
    28                 }    
    29             }
    30         }
    31         
    32         if(flag == 0)
    33             continue;
    34         else
    35         {
    36                 int sum1 = a[0] + a[1] + a[2];
    37                 int sum2 = a[0] + a[3] + a[6];
    38                 int sum3 = a[6] + a[7] + a[8];
    39                 int sum4 = a[2] + a[5] + a[8];
    40                 int sum5 = a[0] + a[4] + a[8];
    41                 int sum6 = a[2] + a[4] + a[6];
    42                 if(sum1 == sum2 && sum2 == sum3 && sum3 == sum4 && sum4 == sum5 && sum5 == sum6)
    43                 {
    44                     memcpy(result, a,sizeof(a));
    45                     cnt++;
    46                 }                    
    47         }
    48     
    49     }while(next_permutation(a,a+9));    
    50     
    51     if(cnt == 1)
    52     {
    53         for(int i = 0; i < 9; ++i)
    54         {
    55             if(i % 3 == 2)
    56                 cout << result[i] << endl;
    57             else
    58                  cout << result[i] << ' ';    
    59         } 
    60     }
    61     else
    62         cout << "Too Many" << endl;
    63     
    64     return 0;
    65 }
  • 相关阅读:
    关于放入cookie中的中文取出后变乱码的问题及解决办法!
    用灌了google的颜色搜索,可以看看这个。
    趁准备换个工作的工夫,去天津走了一圈.
    python的面向对象学习分享
    Http Handler 介绍
    大型网站系统架构分析
    Http 请求处理流程
    uniapp nfc读写
    安卓的颜色透明度和html的不一样
    uniapp App上传文件
  • 原文地址:https://www.cnblogs.com/FengZeng666/p/10576303.html
Copyright © 2011-2022 走看看