持续更新
一、39级台阶
问题描述
小明刚刚看完电影《第39级台阶》,离开电影院的时候,他数了数礼堂前的台阶数,恰好是39级!
站在台阶前,他突然又想着一个问题:
如果我每一步只能迈上1个或2个台阶。
先迈左脚,然后左右交替,最后一步是迈右脚,也就是说一共要走偶数步。
那么,上完39级台阶,有多少种不同的上法呢?
请你利用计算机的优势,帮助小明寻找答案。
解题思路
上 1个台阶 或者 2个台阶 分别做出口
/**
*
* @author sjf666
*
* 2020年4月3日上午8:55:14
*/
public class Demo05_第39级台阶 {
static int count ;
public static void main(String[] args) {
f(0, 0);
System.out.println(count);
}
/**
*
* @param step 步数
* @param floor 楼梯阶数
* @return
*/
public static void f(int step , int floor) {
if(floor > 39)
return;
if( floor == 39 && step % 2 == 0 ) {
count ++;
return;
}
//有两种情况 是一个 二叉树的生成过程
f(step+1, floor+1);
f(step+1, floor+2);
}
}
二、李白喝酒
问题描述
话说大诗人李白,一生好饮。幸好他从不开车。
一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱:
无事街上走,提壶去打酒。
逢店加一倍,遇花喝一斗。
这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。 请你计算李白遇到店和花的次序,可以把遇店记为a,遇花记为b。
则:babaabbabbabbbb 就是合理的次序。
像这样的答案一共有多少呢?请你计算出所有可能方案的个数(包含题目给出的)。
解题思路
基本的递归题
找到不同的处理方式作为进入下一层的标志
此题就是 李白遇见花 或者 遇见酒 分别做讨论就行
/**
*
* @author sjf666
*
* 2020年4月2日下午9:32:59
*/
public class Demo03_李白打酒 {
static int count ;
static StringBuffer ans ;
public static void main(String[] args) {
ans =new StringBuffer(""); //初始化
f(2, 5, 10);
System.out.println(count); //14
}
public static void f(int jiu ,int dian , int hua) {
if(jiu <= 0 || dian < 0 || hua == 0 )
return;
if(dian == 0 && hua == 1) {
if(jiu == 1) {
//System.out.println(ans+"b");
count ++ ;
}
return;
}
ans.append('a');
f(jiu*2, dian-1, hua);
ans.deleteCharAt(ans.length()-1);
ans.append('b');
f(jiu-1, dian, hua-1);
ans.deleteCharAt(ans.length()-1);
}
}
三、六角填数
问题描述
如图所示六角形中,填入1~12的数字。
使得每条直线上的数字之和都相同。
图中,已经替你填好了3个数字,请你计算星号位置所代表的数字是多少?
解题思路
递归找出每个位置的数字 然后进行判断
/**
*
* @author sjf666
*
* 2020年4月3日上午9:53:21
*/
/*
* 分析 用一维数组 规律搞清 答案要 a[5]
*/
public class Demo06_六角填数 {
static int[] ans = {1,8,0,0,0,0,0,0,0,0,0,3};
static int[] book = {0,1,0,1,0,0,0,0,1,0,0,0,0}; //标记数组
public static void main(String[] args) {
dfs(0);
}
public static void dfs(int step) {
if(step == 12) {
if(check()) {
System.out.println(ans[5]); //10
System.exit(0); //直接终止程序
}
else
return;
}
if(ans[step] == 0) {
for(int i = 1 ;i <= 12 ; i++) {
if(book[i] == 0) {
ans[step] = i ;
book[i] = 1;
dfs(step+1);
book[i] = 0;
}
}
ans[step] = 0 ;
}
else
dfs(step+1);
}
public static boolean check() {
int num = ans[0]+ans[2]+ans[5]+ans[7];
if(num == ans[0]+ans[3]+ans[6]+ans[10] &&
num == ans[7]+ans[8]+ans[9]+ans[10] &&
num == ans[1]+ans[2]+ans[3]+ans[4] &&
num == ans[1]+ans[5]+ans[8]+ans[11] &&
num == ans[4]+ans[6]+ans[9]+ans[11]
)
return true;
else
return false;
}
}