标题:纸牌三角形
A,2,3,4,5,6,7,8,9 共9张纸牌排成一个正三角形(A按1计算)。要求每个边的和相等。
下图就是一种排法(如有对齐问题,参看p1.png)。
A
9 6
4 8
3 7 5 2
这样的排法可能会有很多。
如果考虑 旋转、镜像后相同的算同一种,一共有多少种不同的排法呢?
请你计算并提交该数字。
注意:需要提交的是一个整数,不要提交任何多余内容。
A,2,3,4,5,6,7,8,9 共9张纸牌排成一个正三角形(A按1计算)。要求每个边的和相等。
下图就是一种排法(如有对齐问题,参看p1.png)。
A
9 6
4 8
3 7 5 2
这样的排法可能会有很多。
如果考虑 旋转、镜像后相同的算同一种,一共有多少种不同的排法呢?
请你计算并提交该数字。
注意:需要提交的是一个整数,不要提交任何多余内容。
解题思路:把九张牌想成是一个1-9的数组,利用全排列,4个数字为一组,三组数字和相同则符合条件。
排除旋转、镜像后相同的方法:只要保证三个角上(下标 0 3 6)的数字组合不同,例如实例中三个角为1 2 3,则当三个角为123时有六种排法(123,132,213,231,312,321)算同一种,所以只需将全排列符合的答案除以6即可得出答案。
答案:144
public class P2 {
public static int[] card = new int[9];
//使用标志
public static boolean[] flag = new boolean[9];
public static int sum=0;
//计算三组数字和是否相同
public static boolean cmp(int[] card){
int side1 = card[0]+card[1]+card[2]+card[3];
int side2 = card[3]+card[4]+card[5]+card[6];
int side3 = card[6]+card[7]+card[8]+card[0];
if(side1==side2&&side2==side3)
return true;
return false;
}
//全排列
public static void traverse(int n){
if(n==9){
if(cmp(card))
sum++;
return;
}
for(int i=0;i<9;i++){
if(flag[i]==false){
flag[i]=true;
card[n] = i+1;
traverse(n+1);
flag[i]=false;
}
}
}
public static void main(String[] args) {
traverse(0);
System.out.println(sum/6);
}
}