DFS深度优先搜索

来源:互联网 发布:自动门机组 淘宝 编辑:程序博客网 时间:2024/05/01 15:51

搜索算法的核心个人学习过程中总结有两个(求不喷):

1.有序的扩展

2.有效利用记录数组进行标记


经典案例:迷宫问题(0可走,1不可走,找最短路径)


#include"iostream"
#include"cstdio"
#define inf 9999999         //对mink进行初始化,便于进行最小的比较
using namespace std;


int map[55][55];
int book[55][55];         //注意全局变量在定义的时候自动进行初始化为0
int startx,starty;
int endx,endy;
int next[4][2]={{1,0},{0,1},{-1,0},{0,-1}};          //枚举四个方向
int n,m;
int mink=inf;


void dfs(int startx,int starty,int step)
{
int dx,dy;
if(startx==endx&&starty==endy)
{
mink=min(mink,step);

else
{
for(int i=0;i<=3;i++)
{
dx=startx+next[i][0];
dy=starty+next[i][1];
if(dx<1||dx>n||dy<1||dy>m||map[dx][dy]==1)
{
continue;
}
else
{
if(book[dx][dy]==0&&map[dx][dy]==0)
{
book[dx][dy]=1;
dfs(dx,dy,step+1);
book[dx][dy]=0;          //还原
}
}
}
}
}


int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>map[i][j];
}
}
cin>>startx>>starty>>endx>>endy;
book[startx][starty]=1;
dfs(startx,starty,0);
cout<<mink<<endl;
return 0;




注意有别于广度优先搜索,深度优先搜索是利用递归调用实现的

0 0
原创粉丝点击