首页 > 代码库 > 反幻方

反幻方

我国古籍很早就记载着

2 9 4
7 5 3
6 1 8

这是一个三阶幻方。每行每列以及对角线上的数字相加都相等。

下面考虑一个相反的问题。
可不可以用 1~9 的数字填入九宫格。
使得:每行每列每个对角线上的数字和都互不相等呢?


这应该能做到。
比如:
9 1 2
8 4 3
7 5 6

你的任务是搜索所有的三阶反幻方。并统计出一共有多少种。
旋转或镜像算同一种。

比如:
9 1 2
8 4 3
7 5 6

7 8 9
5 4 1
6 3 2

2 1 9
3 4 8
6 5 7

等都算作同一种情况。

请提交三阶反幻方一共多少种。这是一个整数,不要填写任何多余内容。
结果:3120

 全排列,在判断符不符合条件

 1 import java.util.Arrays;
 2 
 3 
 4 public class Main {
 5     static int[][] a;
 6     static boolean[] b;
 7     static int sum;
 8     public static void main(String[] args) {
 9         a = new int[4][4];
10         b = new boolean[10];
11         f(1);
12         System.out.println(sum/8);
13     }
14     static void f(int i){
15         if(i==10){
16             if(f1()){
17                 sum++;
18             }
19         }
20         for(int j=1;j<=9;j++){
21             if(!b[j]){
22                 b[j] = true;
23                 a[(i-1)/3+1][(i-1)%3+1] = j;
24                 f(i+1);
25                 b[j] = false;
26             }
27         }
28     }
29     /*
30      *  9 1 2
31         8 4 3
32         7 5 6
33      * */
34     static boolean f1(){
35         
36         int[] c = new int[9];
37         c[1] = a[1][1]+a[1][2]+a[1][3];
38         c[2] = a[2][1]+a[2][2]+a[2][3];
39         c[3] = a[3][1]+a[3][2]+a[3][3];
40         c[4] = a[1][1]+a[2][1]+a[3][1];
41         c[5] = a[1][2]+a[2][2]+a[3][2];
42         c[6] = a[1][3]+a[2][3]+a[3][3];
43         c[7] = a[1][1]+a[2][2]+a[3][3];
44         c[8] = a[1][3]+a[2][2]+a[3][1];
45         boolean flag = true;
46         for(int i=1;i<8;i++){
47             for(int j=i+1;j<=8;j++){
48                 if(c[i]==c[j]){
49                     flag = false;
50                     break;
51                 }
52                 }
53             if(!flag){
54                 break;
55             }
56         }
57         return flag;
58     }
59     
60 }

 

反幻方