dfs

dfs其实就是深度优化搜索,要是理解简单一点,你可以把它叫成电风扇,是一种搜索方式,代码实现的载体基本上是递归函数,

要求是对递归的结构必须完全理解

————————————————————

有一个拍卖会从高价开始起拍,如果没有人举成交牌就降价,而且在降价时还有规律:假如第i次报价为w元,那么第i+1次报价为w-a或者w-b元,如果降到p元时,你认为价格合适,赶快第一个举成交牌,你就花p元买下了商品。
任务:把商品从w元降到p元的方法总数

————————————————————

这完全是一道递归题,就当它是dfs做吧,至于递归的博客,以后再更新

————————————————————

[cpp] view plain copy
#include<bits/stdc++.h>  
using namespace std;  
long long w,p,a,b,tot[1300000];  
int search(int start,int end)  
{  
    if(start==end)return 1;  
    if(start<end)return 0;  
    if(tot[start]>0)return tot[start];  
    tot[start]=search(start-a,end)+search(start-b,end);  
    return tot[start];  
}  
int main()  
{  
    cin>>w>>p>>a>>b;  
    search(w,p);  
    cout<<tot[w]<<endl;  
    return 0;  
}  

————————————————————

还有一道就是经典的八皇后问题

八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后



————————————————————

这是一道回溯的题,用到的是经典回溯思想显然,这道题的思路就是尝试在每一行的每一个位置放下皇后,然后对不能放的位置进行标记,每一次尝试放皇后的时候检测当前位置有没有标记即可。

————————————————————

#include<bits/stdc++.h>
using namespace std;
int n,tot=0;
bool line[1000]={},ri[1000]={},le[1000]={};
void solve(int row)
{
	if(row==n)
	{
		tot++;
		return ;
	}
	for(int i=0;i<n;i++)
	{
		if(!(line[i]||ri[row-i+n]||le[row+i]))
		{
			line[i]=ri[row-i+n]=le[row+i]=true;
			solve(row+1);
			line[i]=ri[row-i+n]=le[row+i]=false;
		}
	}
}
int main()
{
	cin>>n;
	solve(0);
	cout<<tot<<endl;
	return 0;
}
————————————————————
dfs就差不多到这了,下期写出bfs,有问题者发我邮箱@1419036629@qq.com

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值