五星图案节点填上数字:1~12,除去7和11。
要求每条直线上数字和相等。
请你利用计算机搜索所有可能的填法有多少种。
注意:旋转或镜像后相同的算同一种填法。
/* 5条线 10个点 1 2 3 4 5 6 8 9 10 12
* 每条线4个数字
* 每个数字加2次
**/
public class Main{
public static int[] a = {1,2,3,4,5,6,8,9,10,12};
public static int count = 0;
public static void f(int n){
if(n==10){
//直到得到最后一个数
if(sum_is_equal()){
//判断和是否相等,相等即输出
count++;
}
}
for(int i=n; i<10; i++){
// i n 交换
int temp = a[i];
a[i] = a[n];
a[n] = temp;
//下一层递归 得到第 n+1 个数
f(n+1);
//回溯,恢复现场,i++后与n交换,遍历所有情况
int temp1 = a[i];
a[i] = a[n];
a[n] = temp1;
}
}
private static boolean sum_is_equal(){
int temp = a[0] + a[5] + a[6] + a[2];
if(temp != a[2] + a[7] + a[8] + a[4])
return false;
if(temp != a[4] + a[9] + a[5] + a[1])
return false;
if(temp != a[1] + a[6] + a[7] + a[3])
return false;
if(temp != a[3] + a[8] + a[9] + a[0])
return false;
return true;
/* 0
*
*1 5 9 4
*
* 6 8
* 7
* 2 3
*
**/
}
public static void main(String[] args){
f(0);
System.out.println(count/10);
}
}