题目
题目描述
走n个台阶
单步最多m个台阶,最少1个台阶
每步和前两步走的台阶数不能相同
问有多少种不同的走法
输入
一行整数n,m 表示台阶数,单步跨越的最多台阶数目
1<=n<=100000
2<=m<=7
输出
一行一个整数,表示答案
示例
输入
7 3
输出
2
说明
只有(1,2,3,1)和(1,3,2,1)符合规则
题解
思路
用DFS回溯搜索即可
注意条件每步和前两步走的台阶数不能相同
博主就是理解这个条件不到位,所以没有做对
代码
#include <iostream>
#include <algorithm>
#include <memory>
#include <cstring>
#include <cstdlib>
using namespace std;
int step[10000];
int idx = 0;
int ans = 0;
int n,m;
void dfs(int level) //还剩多少层楼梯
{
if(idx>2 && ( step[idx-1] == step[idx-3])) // 不符合走路规则
return;
if(idx>1 && (step[idx-1] == step[idx-2])) // 不符合走路规则
return;
if(level < 0)//楼梯走超了
return;
if(level == 0) //走完了楼梯
{
ans++;
/*cout<<"way_"<<ans<<": ";
for(int i=0;i<10000;i++)
{
if(!step[i])
break;
cout<<step[i]<<" ";
}
cout<<endl;*/
return;
}
//决定步伐
for(int s=1;s<=m;s++)
{
//走s步
step[idx++] = s;
dfs(level-s);
step[idx--] = 0;
}
}
int main()
{
cin>>n>>m;
dfs(n);
cout<<ans;
return 0;
}
唉,笔试又翻车了