`
MouseLearnJava
  • 浏览: 467280 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

列出走楼梯或者台阶的所有走法

    博客分类:
  • Java
阅读更多

本篇文章主要用来简单模仿走楼梯或者台阶,列出走完楼梯或者台阶所有的走法。

第一个程序:给定台阶数,每次走1步,2步或者3步。
第二个程序:给定台阶数据,每次走的最小台阶数,每次走的最大台阶数以及设定最多能走几次。采用Stack来实现。

第一个程序和运行结果如下:
/**
 * 程序主要用来简单模仿走楼梯(台阶). 给定台阶数,每次走1步, 2步 或者 3步, 列出走完台阶所有的走法.
 * 
 * 例如3级台阶就有四种走法: 
 * 1 1 1 
 * 1 2 
 * 2 1 
 * 3
 * 
 * @author Eric
 * @version 1.0
 * 
 */
public class Stairs {

	// 统计个数
	private int currentCount = 1;
	
	/**
	 * @param remainingSteps
	 *            : 剩余的台阶数,开始调用的值是总的台阶数
	 * @param currentSteps
	 *            : 递归过程中某种情况下,已经走的步骤,如 1 2 走了三步的情况
	 */
	public void walkStairs(int remainingSteps, String currentSteps) {
		/*
		 * 当剩下小于等于三级台阶时,输出楼梯的走法
		 */
		if (remainingSteps <= 3) {
			printWalkWays(remainingSteps, currentSteps);
		} else {
			for (int step = 1; step <= 3; step++) {
				walkStairs(remainingSteps - step, currentSteps + " " + step);
			}
		}
	}

	private StringBuilder getCurrentCountStepInformation(String currentSteps) {
		return new StringBuilder().append("第").append(currentCount++).append(
				"种走法").append(currentSteps);
	}

	/**
	 * 输出满足条件的台阶走法
	 * 
	 * @param remainingSteps
	 * @param currentSteps
	 */
	private void printWalkWays(int remainingSteps, String currentSteps) {
		if (1 == remainingSteps) {
			System.out.println(getCurrentCountStepInformation(currentSteps)
					.append(" 1").toString());
		} else if (2 == remainingSteps) {
			System.out.println(getCurrentCountStepInformation(currentSteps)
					.append(" 1 1").toString());
			System.out.println(getCurrentCountStepInformation(currentSteps)
					.append(" 2").toString());
		} else if (3 == remainingSteps) {
			System.out.println(getCurrentCountStepInformation(currentSteps)
					.append(" 1 1 1").toString());
			System.out.println(getCurrentCountStepInformation(currentSteps)
					.append(" 1 2").toString());
			System.out.println(getCurrentCountStepInformation(currentSteps)
					.append(" 2 1").toString());
			System.out.println(getCurrentCountStepInformation(currentSteps)
					.append(" 3").toString());
		} else {
			/**
			 * 0 ==remainingSteps, 表明已经走完台阶了,直接输出就可以了
			 */
			System.out.println(getCurrentCountStepInformation(currentSteps)
					.toString());
		}
	}

	public static void main(String args[]) {
		Stairs s = new Stairs();
		// 调用方法前需要先判断STEPS是否是大于0的。
		s.walkStairs(5, "");
	}
}


如走5阶台阶有如下几种走法:
第1种走法 1 1 1 1 1
第2种走法 1 1 1 2
第3种走法 1 1 2 1
第4种走法 1 1 3
第5种走法 1 2 1 1
第6种走法 1 2 2
第7种走法 1 3 1
第8种走法 2 1 1 1
第9种走法 2 1 2
第10种走法 2 2 1
第11种走法 2 3
第12种走法 3 1 1
第13种走法 3 2

第二个程序和运行结果如下:

/**
 * 题目:走楼梯
 *    给定台阶数目 -- SUM,
 *    每次最大的台阶数 -- MAX
 *    每次最小的台阶数 -- MIN
 *    期望值(最多在几步之内完成) -- EXPECT
 * 
 * 思路:
 *    采用递归的方法实现。采用Stack结构来存储。
 *        
 */

import java.util.Stack;

/**
 * 题目:走楼梯
 *    给定台阶数目 -- SUM,
 *    每次最大的台阶数 -- MAX
 *    每次最小的台阶数 -- MIN
 *    期望值(最多在几步之内完成) -- EXPECT
 * 
 * 思路:
 *    采用递归的方法实现。采用Stack结构来存储。
 *        
 * @author Eric
 * @version 1.0
 *
 */
public class Stair2 {

 private Stack<Integer> stack = new Stack<Integer>();

 private int currentCount = 0;

 /**
  * @param min
  * @param max
  * @param current
  * @param expect
  * @param sum
  */
 private void getWalkWays(int min, int max, int current, int expect, int sum) {
  //当Stack中的数据和与总的台阶数一样时,输出结果
  if (sum == current) {
   //输出满足条件的内容,其中,期望值(最多在几步之内完成)
   if ( expect >= stack.size()) {
    print(stack);
   }
  }
  //循环最小值到最大值
  for (int currentIndex = min; currentIndex <= max; currentIndex++) {
   /*
    * 如果当前Stack中的值的和(current)加上当前循环的值(currentIndex)
    * 小于等于总的台阶数,那么就先把当前循环的值压入到Stack中,
    * 当前Stack中所有数据值的和加上当选循环的值
    * 递归调用getWalkWays方法
    * 然后,将stack的pop值去掉并修改Stack中当前所有元素的和
    */
   if (current + currentIndex <= sum) {
    stack.push(currentIndex);
    current += currentIndex;
    getWalkWays(min, max, current, expect, sum);
    current -= stack.pop();
   }
  }
 }

 /**
  * 得到输出的前缀。
  * 如: 
  *   第50中走法
  * @return  
  */
 private String getCountInformation() {
  return new StringBuilder().append("第").append(++currentCount).append(
    "中走法:").toString();
 }

 /**
  * 打印当前Stack中的元素
  * 如:
  *   第50中走法:4 4 2
  * 
  * @param stack
  */
 private void print(Stack stack) {
  // 添加满足条件集合的元素个数范围
  StringBuilder sb = new StringBuilder();
  sb.append(getCountInformation());
  for (Object o : stack) {
   sb.append(o).append(" ");
  }
  System.out.println(sb.deleteCharAt(sb.length() - 1).toString());

 }

 /**
  * 输出符合条件的走楼梯条件信息。
  *
  */
 private void printResultTips(int min, int max, int sum, int expectTimes) {
   System.out.println(new StringBuilder().append("条件==》").append("台阶数为").append(sum)
     .append(", 每步走的最小台阶数为").append(min).append(", 每步走的最大台阶数为")
     .append(max).append(",最多走的次数是").append(expectTimes).toString());  
 }

 /**
  * 测试方法
  *
  */
 public void test() {
  int min = 2;
  int max = 4;
  int expectTimes = 4;
  int totalSteps = 10;
  
  printResultTips(min, max, totalSteps, expectTimes);
  getWalkWays(min, max, 0,expectTimes,totalSteps);
 }

 public static void main(String[] args) {
  //测试
  new Stair2().test();
 }
}

条件==》台阶数为10, 每步走的最小台阶数为2, 每步走的最大台阶数为4,最多走的次数是4
第1中走法:2 2 2 4
第2中走法:2 2 3 3
第3中走法:2 2 4 2
第4中走法:2 3 2 3
第5中走法:2 3 3 2
第6中走法:2 4 2 2
第7中走法:2 4 4
第8中走法:3 2 2 3
第9中走法:3 2 3 2
第10中走法:3 3 2 2
第11中走法:3 3 4
第12中走法:3 4 3
第13中走法:4 2 2 2
第14中走法:4 2 4
第15中走法:4 3 3
第16中走法:4 4 2
0
0
分享到:
评论
1 楼 LinApex 2013-05-11  
已经碰到过这个问题。

相关推荐

    极简楼梯台阶式计划总结PPT模板.pptx

    【极简楼梯台阶式计划总结PPT模板】是一种设计简洁、结构清晰的演示文稿工具,主要用于呈现工作或项目的总结、进度以及未来规划。在IT行业中,这种模板可以帮助专业人士高效地整理和展示他们的工作成果、挑战、解决...

    电信设备-可上下楼梯台阶的折叠式箱包、行李移动装置.zip

    4. **材料与性能**:列出使用的材料及其特性,如耐用性、轻便性,以及任何特殊的防护措施,以确保设备和人员的安全。 5. **适用场景**:列举出这款装置在电信行业中可能应用的具体场景,如住宅区、商业楼宇、基站等...

    递归函数大集成

    由于这是一个穷举法解决问题的例子,输出将列出所有符合条件的球员位置分配情况。 #### 3. 下楼梯问题 本问题要求计算从顶部到底部的不同走法数量,每次可以跳1、2或3个台阶。 **代码解析:** ```c #include #...

    人版数学七年级(上册)期末模拟试卷与答案共2套.doc

    20. **动态走法**:根据上楼梯的走法归纳出规律,找出有四个台阶时的走法数量。 解答题部分包括计算、解方程、错误分析、等差数列的规律、角度的计算以及几何体的性质等,这些都是初中数学的重要知识点。 通过这些...

    北京市装修定额说明和计算规则.doc

    2. 定额项目中龙骨和面层分开列出,使用时应根据设计选择相应子目。 3. 面层装饰中,预制板的抹灰、粘贴面层已包括勾缝,不再另计。 4. 吊顶的其他项目,如金属格栅吸声板,按组装形式分项,可调整吸声体支架间距。 ...

    数学广角植树问题PPT课件.pptx

    6. **楼梯问题**:小明从1楼到3楼走了36级台阶,可以推断每层楼有18级台阶,那么从1楼到6楼需要走90级台阶。 7. **军事队列问题**:15个军人站成一列,每两人间距离1米,队伍总长是14米(不包括起始位置,所以是15 ...

    12级实训答疑汇编[归类].pdf

    6. 材料和做法未列出:对于护窗栏杆、楼梯踏步防滑条和美术字等,若未明确说明,通常意味着不考虑在内。 7. 轻质砖隔墙:若无合适子目,可以考虑用其他材料替代,如全塑钢板。 8. 楼梯踏步侧面做法:如果未标注,...

    重庆实验外国语学校2020小升初数学.docx

    从1楼到3楼走了2层楼梯,每层36级,所以从1楼到5楼走4层,需要4×36=144级台阶。 - 题目6:最大公约数和最小公倍数的关系是它们的乘积等于两个数的乘积。所以24和60的最大公约数和最小公倍数之和为24×60/(24,60)=...

    建筑施工组织2021-商铺单元验收交接表.doc

    3. 楼梯台阶及扶手:检查台阶的高度、深度是否一致,防滑性能如何,扶手安装牢固,无晃动,高度适宜,符合安全规范。 4. 墙面:检查墙面的平整度、色泽一致性,无空鼓、开裂、脱落现象,涂料或壁纸质量合格。 5. ...

    CleanSpecforionia73400TWD成品油轮技术规格书.docx

    主尺寸与特性**:具体列出油轮的长度、宽度、吃水深度等主要物理尺寸数据及其它技术参数。 ### 四、载重量与容量 - **004. 载重量与容量**:详细说明油轮的最大载重量(73,000DWT),以及各种舱室如货舱、燃料舱等...

    苏版四年级数学上册易错题库完整.doc

    9. **几何问题**:题目18中通过树木的数量和时间计算汽车的速度,以及题目24中通过楼梯台阶数量求解楼层高度。 10. **应用问题**:题目14中通过已知的骡子运货量推算增加骡子后的总运货量。 11. **整数除法的余数...

    XXXX《建筑识图与构造》土建.pptx

    课程的教学大纲详细列出了各个学习模块,包括: 1. 制图基本知识:这部分介绍了制图工具的使用方法,如丁字尺、三角板、图板、圆规等,还涉及到图纸的规格、图线绘制、尺寸标注等内容,以及几何作图技巧。 2. 投影...

    石家庄市重点小学2019-2020学年小学五年级数学上学期期末考试试题.pdf

    - 第1题考察了组合问题,通过设未知数(5元人民币的数量)和列出等式解决。 - 第2题涉及到几何形状的面积比较,要求学生理解长方形和平行四边形面积的计算方法。 - 第3题讨论了小数乘法的结果,强调了乘积可能是...

    潘口和小漩水电站保洁服务方案.docx

    最后是成本预算部分,方案中详细列出了各项服务的预计费用,包括人工、材料、设备的使用和维护等,这不仅有助于合理分配资源,保证保洁服务的可持续性,同时也为电站管理层提供决策参考,确保经济效益和环境效益的...

    地面砖面层-隐蔽工程验收记录文本.doc

    这些记录详细列出了各项工程的质量要求、施工标准以及验收结果,旨在确保工程的质量和安全。 1. 地面砖面层: - 验收依据为《建筑装饰装修工程质量验收规范》GB50210-2001。 - 要求面层使用的板块品种和质量需...

    建筑面积怎么计算.doc

    《建筑面积怎么计算》这篇文档详细阐述了在房地产测量中如何计算建筑面积,并且列出了10种不计入建筑面积的情况。在了解这些知识时,首先要明确建筑面积的重要性,它涉及到产权的界定、物业费的计算以及购房者的权益...

    1施工图绘制概要090416.pptx

    1. 目录:列出所有图纸的清单。 2. 建筑设计说明和做法说明:规定所遵循的规范和具体做法。 3. 平面施工图:如一层平面图关注散水、室外台阶、门窗楼梯等,地下室平面图强调墙体处理、防水和设备间定位,标准层和...

    办公楼公共区域验收交接表.doc

    这个表格详细列出了需要验收的各项设施和设备,涵盖了办公楼日常运营中的关键元素,以确保所有设施的质量和功能完好。以下是基于表格内容的详细知识点解释: 1. **地台地毯**:验收时需检查地毯的铺设是否平整,...

    浙江省建设工程造价员资格考试.docx

    12. **装饰木门扇定额**:包括门扇制作和安装,每扇门通常预设2只铜合页,但门框制作和安装、门锁安装通常需要单独列出项目计算。 此外,材料、成品、半成品的价格计算中,可能需要考虑场外运输、场内水平和垂直...

    河北装饰装修定额计算规则说明.docx

    楼梯踢脚线、防静电活动地板附件等的计算,要求在工程量清单中单独列出,以确保完整性和准确性。 七、工程量运算规则 整体面层、找平层、垫层、块料面层的面积计算遵循一定的规则,例如扣除特定结构所占面积,不...

Global site tag (gtag.js) - Google Analytics