标题:五星填数
如【图1.png】的五星图案节点填上数字:1~12,除去7和11。
要求每条直线上数字和相等。
如图就是恰当的填法。
请你利用计算机搜索所有可能的填法有多少种。
注意:旋转或镜像后相同的算同一种填法。
请提交表示方案数目的整数,不要填写任何其它内容。
1.全排列,求出所有组合
2.判断出五条直线相等的组合的个数
3.题目中旋转镜像属于同一种填法。举个例子,我们仅仅关注最外面的array[0]-array[4]
如果有一种填法为12345,是不是同时存在23451/34512/45123/51234与都满足判断但是可以旋转得到
所以5种为一种填法。然而12345有和15432为镜像关系其他四个同
所以任意一种组合经过镜像和旋转都有10中不同的组合满足判断,所以最后结果除以10即可
package com.jueshai2015;
import java.util.HashSet;
public class _2 {
public static int[] array = {1,2,3,4,5,6,8,9,10,12};
public static int count = 0;
public static void All_P(int n){
if(n == 10){
if(jud()){
for(int i = 0; i< 10; i++){
System.out.print(array[i]+" ");
}
System.out.println();
count++;
}
}
for(int i = n; i < 10; i++){
int temp = array[i];
array[i] = array[n];
array[n] = temp;
All_P(n+1);
int tmep = array[i];
array[i] = array[n];
array[n] = tmep;
}
}
private static boolean jud() {
// TODO Auto-generated method stub
int temp = array[0]+array[5]+array[6]+array[2];
if(temp != array[2]+array[8]+array[7]+array[4])
return false;
if(temp != array[4]+array[5]+array[9]+array[1])
return false;
if(temp != array[1]+array[6]+array[7]+array[3])
return false;
if(temp != array[3]+array[8]+array[9]+array[0])
return false;
return true;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
All_P(0);
System.out.println(count/10);
}
}