/* 标题:九宫幻方 小明最近在教邻居家的小朋友小学奥数,而最近正好讲述到了三阶幻方这个部分,三阶幻方指的是将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(); } } } }