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
     */
    
    
    import java.util.Arrays;
    import java.util.Scanner;
    
    public class Main {
        static int N = 9;
        static int[] a;
        static boolean[] used;
        static int count = 0;
        static int[] records;
    
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            a = new int[N];
            used = new boolean[N];
            records = new int[N];
            for (int i = 0; i < N; i++) {
                int t = sc.nextInt();
                a[i] = t;
                if (t != 0) used[i] = true;
            }
            sc.close();
            dfs(0);
            if (count == 1) {
                p(records);
            } else if (count > 1) {
                System.out.println("Too Many");
            }
        }
    
    
        static void dfs(int k) {
            if (k < N) {
                if (used[k]) {
                    if (k < 8) {
                        dfs(k + 1);
                    } else if (k == 8 && check(a)) {
                        records= Arrays.copyOfRange(a,0,N);
                        count++;
                    }
                } else {
                    for (int i = 1; i <= 9; i++) {
                        a[k] = i;
                        boolean flag = false;
                        for (int j = 0; j < N; j++) {
                            if (j != k && i == a[j]) {
                                flag = true;
                                break;
                            }
                        }
                        if (!flag) {
                            if (k < 8) {
                                dfs(k + 1);
                            } else if (k == 8 && check(a)) {
                                records= Arrays.copyOfRange(a,0,N);
                                count++;
                            }
                        }
                    }
                    a[k] = 0;
                }
    
            }
        }
    
        static boolean check(int a[]) {
            for (int i = 0; i < N; i++)
                if (a[i] == 0) return false;
            int t1 = a[0] + a[1] + a[2];
            int t2 = a[3] + a[4] + a[5];
            int t3 = a[6] + a[7] + a[8];
    
            int t4 = a[0] + a[3] + a[6];
            int t5 = a[1] + a[4] + a[7];
            int t6 = a[2] + a[5] + a[8];
            int t7 = a[0] + a[4] + a[8];
            int t8 = a[2] + a[4] + a[6];
            if (t1 == t2 && t1 == t3 && t1 == t4 && t1 == t5 && t1 == t6 && t1 == t7 && t1 == t8) {
                return true;
            }
            return false;
        }
    
        static void p(int[] a) {
            for (int i = 1; i < a.length + 1; i++) {
                System.out.print(a[i - 1] + " ");
                if (i % 3 == 0) {
                    System.out.println();
                }
            }
        }
    }
  • 相关阅读:
    9-29 函数嵌套及作用域链
    9-29 函数进阶_命名空间和作用域
    9-28 函数
    9-27 文件的”改”、删、重命名
    9-26 联合文件的登录注册
    9-26 文件操作一些功能详解
    9-26 文件操作
    9-26 复习数据类型
    9-25 集合
    python基础day7_购物车实例
  • 原文地址:https://www.cnblogs.com/Alpharun/p/8669435.html
Copyright © 2011-2022 走看看