【题目】 请你计算这样的搭法一共有多少种? 【再次分析】
小明最近喜欢搭数字积木,
一共有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
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算