DFS (深度优先搜索)
(与BFS比较)DFS更适合树结构,BFS更适合图结构
适合情况:
- 具有递归性质的问题
- 适合地图类型的问题
- 需要情况列举的问题
判断思路:
- 是否能转换成树形结构和图结构
- 思考转换后状态的数据量
- 如果数据量较多,思考是否有可能进行剪枝处理( ?)
- 判断是否能用DFS
数据型:
全排列 (其中包含深度优先搜索的基本模型)
#include <iostream>
using namespace std;
const int MAXN = 1007;
int a[MAXN],book[MAXN]={},n;//一共有n个盒子
void dfs(int step)//step表示现在站在第几个盒子面前
{
if(step==n+1)///如果站在第n+1个盒子面前(没有第 n+1的盒子),则表示前n个盒子已经放好扑克牌
{
///输出一种排列
for(int i=1;i<=n;i++)
cout << a[i];
cout << endl;
return;///返回之前一步(最近一次调用dfs函数的地方)
}
for(int i=1;i<=n;i++)
{
///判断扑克牌i是否还在手上
if(book[i]==0)
{
a[step]=i;///将i号扑克牌放入第step个盒子
book[i]=1;
dfs(step+1);
book[i]=0;///一定要将刚才尝试的扑克牌收回,才能进行下一次尝试
}
}
return;
}
int main()
{
cin >> n;
dfs(1);///首先站在1号小盒子面前
return 0;
}
地图型:
地图问题(在某一地图中寻找从起始点到终点的最短路径)
有一个m n格的迷宫(表示有m行,n列),其中包含障碍物,1表示有障碍物,0表示无障碍物可以前进。
#include <iostream>
using namespace std;
const int maxn = 1007;
int x, y, step, p, q, sx, sy, tx, ty, n, m, Min = 99999999;
int a[maxn][maxn];
int book[maxn][maxn]={};//该数组判断某一点是否走过
int next[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};//分别为向右走,向下走,向左走和向上走
void dfs(int x, int y, int step)//此时走到的点的x坐标,y坐标以及当前已经走过的步数step
{
if(x==p && y==q)
{
//更新最小值
if(step<Min)
{
Min=step;
}
return;
}
for(int k=0; k<4; k++)
{
tx=x+next[k][0];
ty=y+next[k][1];
//判断是否越界
if(tx<1||tx>n||ty<1||ty>m)
continue;
//判断该点是否为障碍物或已经走过
if(a[tx][ty]==0 && book[tx][ty]==0)
{
book[tx][ty]=1;//标记该点已经走过
dfs(tx,ty,step+1);//开始尝试下一个点
book[tx][ty]=0;//尝试结束,取消这个点的标记
}
}
return;
}
int main()
{
cin >> n >> m;
//读入迷宫
for(int i=1; i<=n; i++)
for(int j =1; j<=m; j++)
cin >> a[i][j];
cin >> sx >> sy >> p >> q; //读入起始点坐标和终点坐标
book[sx][sy]=1;
dfs(sx,sy,0);
cout << Min << endl;
return 0;
}
- List item