蓝桥杯--纸牌三角形

A,2,3,4,5,6,7,8,9 共9张纸牌排成一个正三角形(A按1计算)。要求每个边的和相等。
下图就是一种排法(如有对齐问题,参看p1.png)。

A

9 6
4 8
3 7 5 2
1
2
3
4
这样的排法可能会有很多。

如果考虑旋转、镜像后相同的算同一种,一共有多少种不同的排法呢?

请你计算并提交该数字。

注意:需要提交的是一个整数,不要提交任何多余内容。

static int count =0;

public static void main(String[] args) {
    int a[] = new int[9];//用一个长度为9的数组a存放9个数字
    for (int i = 0; i < a.length; i++) {//用for循环给这个数组赋值,输入这9个数字
        a[i] = i+1;
    }
    dfs(a,0);//调用dfs方法,以0开始
    System.out.println(count/6);//这里其实是count/3/2,除以3是排除了旋转,除以2是排除了镜像
}

// 是一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件,搜索将回溯到发现节点v的那条边的起始节点。整个进程反复进行直到所有节点都被访问为止
private static void dfs(int[] a, int begin) {//dfs()深度优先算法的变量值为数组a和begin,遍历
if (begin>= a.length) {//递归循环结束的条件是begin大于等于数组a的长度
check(a);//如果大于等于则计算三边和
return ;
}
for (int i = begin; i < a.length; i++) {//
int temp = a[begin];//借助第三者temp交换a[begin]与a[i]的值
a[begin] = a[i];
a[i] = temp;
dfs(a, begin+1);//递归
temp = a[begin];//回溯
a[begin] = a[i];
a[i] = temp;
}
}
//用一个数组记录三角形三边各自的和
private static void check(int[] a) {
int b[] = new int[3];//用一个长度为3的数组b存放三角形的三条边
b[0] = a[0]+a[1]+a[2]+a[3];
b[1] = a[3]+a[4]+a[5]+a[6];
b[2] = a[6]+a[7]+a[8]+a[0];

    if (b[0]==b[1]&&b[1]==b[2]) {//比较三边之和是否相等
        count++;相等则记录下这种情况的三角形
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值