DFS (深度优先搜索)

mac2025-10-10  1

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
最新回复(0)