c++数楼梯问题的新思路--dfs

我们废话不多说,直接看题:

 我用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;	
}

但这时斐波那契数列就不能用了

这里提前祝大家新年快乐! 

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘艺金

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值