您的位置:首页 > 编程语言 > C语言/C++

2013蓝桥杯 【初赛试题】 第39级台阶

2014-02-08 21:17 218 查看
题目描述:

    小明刚刚看完电影《第39级台阶》,离开电影院的时候,他数了数礼堂前的台阶数,恰好是39级!

    站在台阶前,他突然又想着一个问题:

    如果我每一步只能迈上1个或2个台阶。先迈左脚,然后左右交替,最后一步是迈右脚,也就是说一共要走偶数步。那么,上完39级台阶,有多少种不同的上法呢?

输出格式:

输出一个整数

程序分析:

这个程序不需要纠结在左脚和右脚的问题上,从中抽象出限制条件:一共走的步数是偶数;

我们可以通过递归来实现,对每次递归的结果进行判断,如果走过的台阶数为39则,结束递归,判断走的步数是否为偶数,为偶数则为上法计数器加一,否则为无效上法;

#include<iostream>
using namespace std;
int count=0;
void fun(int stair,int step)
{	//stari用于表示剩余的楼梯的层数,当等于0时停止递归
//step是走过的步数,用来判断是否是偶数,是否符合要求
if(stair<0)return;
if(stair==0)	//39节楼梯全部走完
{
if(step%2 == 0)count++;
return;
}
fun(stair-1,step+1);	//这一步走了一个台阶
fun(stair-2,step+1);	//这一步走了两个台阶
}
int main()
{
fun(39,0);
cout<<count<<endl;
return 0;
}


输出结果为:51167078

要说明stair可能出现小于0的情况,当最后只剩了一个台阶,但是小明想要跨两步的时候,这样是不可能的,也就是说他只能跨一步,两步是不可能出现的,因此也不可能是符合条件的走法。

这种递归的效果如下图:



这个二叉树(本算法并不涉及二叉树知识,只是通过概念来理解)的每个叶子节点都是一种情况:

我们将每一个节点称为(x,y)

叶子节点分为两种情况:x为-1和x为0,x为-1的情况在现实中不可能发生,所以不予以考虑;

我们对每一种x为0的情况都进行判断,如果y的值为偶数,则计数器加1。

评价:该问题也是典型的递归型题目,它对每层递归都进行判断,如果stair<0,则说明不符合题意,则退出;递归终止的条件是stair=0,然后判断走的步数是否为偶数,如果为偶数,则计数器加1,否则退出递归。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ 蓝桥杯