欢迎访问我的新博客:http://www.milkcu.com/blog/
原文地址:http://www.milkcu.com/blog/archives/1370580480.html
标题:第39阶台阶 - 蓝桥杯
内容:2013年第四届蓝桥杯全国软件大赛预赛第三题。
作者:MilkCu(http://blog.csdn.net/milkcu)
题目描述
题目标题: 第39级台阶
小明刚刚看完电影《第39级台阶》,离开电影院的时候,他数了数礼堂前的台阶数,恰好是39级!
站在台阶前,他突然又想着一个问题:
如果我每一步只能迈上1个或2个台阶。先迈左脚,然后左右交替,最后一步是迈右脚,也就是说一共要走偶数步。那么,上完39级台阶,有多少种不同的上法呢?
请你利用计算机的优势,帮助小明寻找答案。
要求提交的是一个整数。
注意:不要提交解答过程,或其它的辅助说明文字。
分析
该情景可简化为39与0和1的关系问题,还有一个限制条件,一共要走偶数步。这道题可以有两种思路,递归与排列组合,代码都不长,重在思考过程。
递归思想
# include <stdio.h>
int n = 0;
int fun(int r, int s)
{
if(r < 0) {
return 0;
}
if(r == 0 && s % 2 == 0) {
n++;
return 0;
}
for(int i = 1; i <= 2; i++) {
fun(r - i, s + 1);
}
}
int main(void)
{
fun(39, 0);
printf("%d\n", n);
return 0;
}
其中,r为remaider的缩写,表示剩余的台阶数;s为step的缩写,表示已经走的步数。我用这种方法的时候,一直在想为什么会有“s % 2 == 0”这个限制条件,原来这是题目的限制条件。
排列组合思想
# include <stdio.h>
int c(int m, int n)
{
int cmn = 1;
for(int i = 0; i < n; i++) {
cmn = cmn * (m - i) / (i + 1);
}
return cmn;
}
int main(void)
{
int n = 0;
for(int i = 1; i <= 19; i += 2) {
n += c(39 - i, i);
}
printf("%d\n", n);
return 0;
}
完全转化为数学问题,实际上就是:
n = c(38, 1) + (36, 3) + ... + c(20, 19)
最后答案
51167078
(全文完)