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
    数据规模和约定
      峰值内存消耗(含虚拟机) < 256M
      CPU消耗 < 1000ms

    Algorithm

    简单操作,全排列,然后让满足幻方条件的数组与我们输入的数组作对比,符合条件的输出即可!


    AC

     1 #include<iostream>
     2 #include<algorithm>
     3 
     4 using namespace std;
     5 
     6 int a[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
     7 int c[9] = {0};
     8 const int s = 15;
     9 int sum = 0;
    10 
    11 bool isOK(int* a)
    12 {
    13     // 居然只有8种 
    14     if(a[0]+a[4]+a[8] != s || a[2]+a[4]+a[6] != s)
    15         return false;
    16     for(int i=0, j=0; i<3; i++, j+=3){
    17         if((a[i]+a[i+3]+a[i+6]) != s)     // 竖向判断 
    18             return false;
    19         if((a[j]+a[j+1]+a[j+2] != s))    // 横向判断
    20             return false; 
    21     }
    22     return true;
    23 }
    24 
    25 void check(int* b)
    26 {
    27     for(int i=0;i<9;i++)
    28         if(b[i]!=0 && b[i] != a[i])
    29             return;
    30     sum++;
    31     for(int j=0;j<9;j++)
    32         c[j] = a[j];    
    33 }
    34 
    35 void show(int* a)
    36 {
    37     for(int i=0;i<7;i+=3)
    38         cout<<a[i]<<" "<<a[i+1]<<" "<<a[i+2]<<endl;
    39     cout<<endl;
    40 }
    41 
    42 int main()
    43 {
    44     int b[9] = {0};
    45     for(int i=0;i<9;i++)
    46         cin>>b[i];
    47     while(next_permutation(a, a+9))
    48     {
    49         if(isOK(a))
    50             check(b);
    51     }
    52     if(sum==1)
    53         show(c);
    54     else
    55         cout<<"Too Many"<<endl;
    56     
    57     return 0;
    58  }
    59  
    View Code
  • 相关阅读:
    多态小结
    Lambda小结
    网络编程小结
    内部类与Lambda
    线程小结
    关于java的静态绑定与动态绑定小结
    多线程
    英语语法十二(可数名词不规则变化)
    英语语法入门十四(名词的作用)
    英语语法入门十三(不可数名词)
  • 原文地址:https://www.cnblogs.com/mabeyTang/p/9975394.html
Copyright © 2011-2022 走看看