Java搭积木游戏

【题目】
小明最近喜欢搭数字积木,
一共有10块积木,每个积木上有一个数字,0~9。
搭积木规则:
每个积木放到其它两个积木的上面,并且一定比下面的两个积木数字小。
最后搭成4层的金字塔形,必须用完所有的积木
下面是两种合格的搭法:

   0            0
  1 2          3 1    
 3 4 5        7 5 2   
6 7 8 9      9 8 6 4

请你计算这样的搭法一共有多少种?
【分析】
首先可以用一个一维数组来表示这个积木
{0,1,2,3,4,5,6,7,8,9},这样正好数组0下标是0,一一对照
然后需要两个方法:
runOne()方法:来为我们找出所有可能的情况
runTwo()方法:每找出一种可能,就调用该方法来判断是否符合搭积木条件
【代码演示】


public class Main {
    // 静态数组
    static int[] num = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    // 计数君
    static int count = 0;
    
    // 主方法在这
    public static void main(String[] args) {
        runOne(0);
        System.out.println(count);
    }

    static void runOne(int n){
        // n为置换到第几个积木了,到第9块积木才能判断
        if (n==9){
            runTwo();
        }
        for (int i=n;i<10;i++){
            // 当程序第一次到这里的时候,这里把i下标与n下标调换位置还是不变的
            // 这里的是给后面已经置换过位置的再次置换回来
            int inputOne=num[i];num[i]=num[n];num[n]=inputOne;
            runOne(n+1);
            // 这里是当楼上方法执行完毕就会执行下标位置调换
            int inputTwo=num[i];num[i]=num[n];num[n]=inputTwo;
        }
    }
    static void runTwo(){
        // 这里是只有当这些条件都满足就能count++,不然只能停止该方法
        if (num[0]>num[1] || num[0]>num[2]) return;
        if (num[1]>num[3] || num[1]>num[4]) return;
        if (num[2]>num[4] || num[2]>num[5]) return;
        if (num[3]>num[6] || num[3]>num[7]) return;
        if (num[4]>num[7] || num[4]>num[8]) return;
        if (num[5]>num[8] || num[5]>num[9]) return;
        count++;
    }
}

【再次分析】
方法runOne()中,有两次调换数组位置,中间夹了一个方法调用,第一次调换位置换不了首次进来的数组,是当runOne(n+1)执行完步后,这时i等于原来的n,n就等于n+1了,这时调换位置就生效了,生效之后当再次遇到第一次调换,就能换回上次的位置,再找一个别的可能的情况
【答案】:768

猜你喜欢

转载自blog.csdn.net/our1624204500/article/details/106809347
今日推荐