爬楼梯问题

来源:互联网 发布:ubuntu 关闭apache2 编辑:程序博客网 时间:2024/04/29 04:36

有m级台阶,每次可以上n个或者n个以下,问有多少种走法。比如有4级 每次最多可以走3级台阶,则走法为{1,1,1,1} {2,1,1,}{1,2,1}{1,1,2}{2,2}{1,3}{3,1}共7种走法。

我觉得可以把这个问题当做一个树,每走完一步后下一步有n-1种走法。直到凑够台阶数。也就是说每个节点下面有n个叉,分别存储下一次要迈出的台阶数。一n=3为例,假设第一次迈出一级,第二次有可能出1 或2 或3,以此类推,直到总迈出数等于m。

1
1 2 3
123 123 123
…..
我们只需要遍历这个树的每个节点,判断当前所有经过路径上节点的和是否为m即可,如果超过m则退回。

#include <stdio.h>#include <stdlib.h>int count = 0;/**i    当前迈出的级数sum  当前层所走的总级数m    台阶总数*/int test(int i, int sum, int m){    if(sum > m)         return 0;    if(sum == m)    {        count++;        return 0;            }    //下一次迈出1级    test(1,1+sum, m);    //下一次迈出2级    test(2,2+sum, m);     //下一次迈出3级     test(3, 3+sum, m);   }main(){         //假设当前有32级台阶  最多一次走3级台阶      test(1, 1, 32);          test(2, 2, 32);      test(3, 3, 32);      printf("result : %d !\n", count);      system("pause");}
2 0
原创粉丝点击