爬楼梯问题

有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");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值