我们废话不多说,直接看题:
我用dfs只做了50,剩下没过,我看了题解大部分用的是斐波那契数列+高精,但是我感觉我这种方法也是一种思路啊,所以我还是决定把它发出来记录一下,请大家批评指正!!!上代码
#include<iostream>
using namespace std;
int n;//台阶数
int sum=0;
void dfs(int step,int flag,int j){ //step是走的楼梯的台阶数
//flag是走楼梯走了多少步
//j是上一步走的楼梯数
if(step==n){
sum++;
if(flag==n/2&&n%2==0){ //如果楼梯是偶数,且用的步数全是俩步两步走, 此时基本就回溯完了,已经把所有的统计完了,输出结果
cout<<sum<<endl;
return;
}else if(flag==n/2+1&&n%2==1&&j==n%2){ //如果是奇数,回溯到最后一种,走到最后一步必然是1,此时输出结果
cout<<sum<<endl;
return;
}
}
for(int i=1;i<=2;i++){ //台阶数只能走一步或两步,所以i<=2
step+=i;
if(step>n)return; //如果n是4,那么有一种情况1,1,1,2,此时大于4,所以我把这种情况剪枝了
dfs(step,flag+1,i);
step-=i; //进行for第二次循环的时候把走的上一步退回来
}
}
int main(){
cin>>n;
dfs(0,0,0);
return 0;
}
一开始我并没有想到斐波那契数列这种规律,这道题是走一步或者两步,但是如果是还能一下走三步呢,这是我们只需要更改我们部分代码即可,如
#include<iostream>
using namespace std;
int n;//台阶数
int sum=0;
void dfs(int step,int flag,int j){ //step是走的楼梯的台阶数
//flag是走楼梯走了多少步
//j是上一步走的楼梯数
if(step==n){
sum++;
if(flag==n/3&&n%3==0){ //如果楼梯是偶数,且用的步数全是俩步两步走, 此时基本就回溯完了,已经把所有的统计完了,输出结果
cout<<sum<<endl;
return;
}else if(flag==n/3+1&&(n%3==1||n%3==2)&&j==n%3){ //如果是奇数,回溯到最后一种,走到最后一步必然是1,此时输出结果
cout<<sum<<endl;
return;
}
}
for(int i=1;i<=3;i++){ //台阶数只能走一步或两步,所以i<=2
step+=i;
if(step>n)return; //如果n是4,那么有一种情况1,1,1,2,此时大于4,所以我把这种情况剪枝了
dfs(step,flag+1,i);
step-=i; //进行for第二次循环的时候把走的上一步退回来
}
}
int main(){
cin>>n;
dfs(0,0,0);
return 0;
}
但这时斐波那契数列就不能用了
这里提前祝大家新年快乐!