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