有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");
}