坏台阶问题

题:

一个人走了很多年,发现自己走到一个很长的,年久失修的楼梯面前。年久失修的意思就是,有k个台阶坏了,没法走。楼梯一共有n层,你一次能上一阶、两阶或三阶台阶,请问,你从楼梯底部(0开始)走到楼梯顶部,共有多少种走法。

输入格式

输入数据共两行,第一行包含两个自然数n(1 ≤ n ≤ 100)和 k (0 ≤ k < n),第二行包含k个自然数Xi (1 ≤ Xi  ≤ n),数字之间用一个空格隔开,表示损坏的台阶的序号(从楼梯底部到楼梯顶部,台阶序号依次为1到n)

输出格式

输出数据仅包含一个整数,表示所有可行走法的总数

样例

input
------------------------------------------
5 2
2 4
------------------------------------------
output
------------------------------------------
2

分析

题目解读很重要,简要说就是有一个楼梯有n个台阶,其中坏了k个台阶不能落脚走,楼梯底部平台编号为0,依次往上自增编号1,2,3......n,n为楼梯顶部的平台。一个人从楼梯底部要走到楼梯顶部去,他一步只能走1个或者2个或者3个台阶,问他有几种方法恰巧能够走到楼梯顶部,不限制步数。

把台阶抽象成数组a,a[0]即为楼梯底部的平台处,a[n] 即为所要到达的楼梯顶部。

万物皆可遍历!遍历就要进行比对判断,所要初始化完表示台阶的a数组之后就需要把a数组中的坏的台阶编号对应的数值修改为特定值,可定为-1。

就像求一个集合有多少子集一样的思路去进行判断,判断当这个人站在某个台阶上的时候往后走1步/2步/3步之后再继续1步/2步/3步的情况。

又可以抽象成一颗树,从根节点往下衍生出孩子节点,一直衍生到叶子节点刚好到顶部台阶(满足)或者超过顶部台阶(不满足)。

直接上代码,代码也加上了一些注释,顺着思路应该就能够清晰了。

题目限制输入输出的格式,但我还是加了点提示按舒服点儿的方式去输入,当然你要去修改成题目要求格式也是可以,但是这不是重点,重点还是在解题上,格式规范舒服就好。

如果真的是平台解题那肯定是需要按输入输出格式来的。

原文地址:https://www.cnblogs.com/Liuyt-61/p/10562486.html