1. 程式人生 > >反幻方

反幻方

九宮格 記載 多少 ++ 全排列 cnblogs nbsp 鏡像 提交

我國古籍很早就記載著

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 }

反幻方