什么是深度优先搜索:
深度优先搜索是一种:枚举所有完整路径以遍历所有情况的搜索方法。
我们可以想象我们正在走一个迷宫,没有上帝视角也没有通信设施,我们只能一条路一条路的去试(枚举),以当前位置为起点,沿着一条路走,碰到岔路口的时候,选择其中一个岔路口前进,如果选择的的这个岔路口是死路,就退回这个岔口道,然后选择另一个岔路前进。如果这个岔口道的所有道路都是死路,那么就退回到上一个岔口道,选择一条没有走过的道路,然后继续走。循环以上方法,直到找到出口为止。这样的搜索方式就叫做深搜。
题目:
第一行给出坐标n,m,随后n表示地图的行,m表示地图的列,接下来的n行m列表示为迷宫,0表示空地,1表示障碍物。最后一行4个数字前两个数表示为迷宫的入口坐标x,y;后两个数表示出口坐标x1,y1;
代码如下:
/**
第一行给出坐标n,m,随后n表示地图的行,m表示地图的列,接下来的n行m列表示为迷宫,0表示空地,1表示障碍物。
最后一行4个数字前两个数表示为迷宫的入口坐标x,y;后两个数表示出口坐标x1,y1;
**/
#include<bits/stdc++.h>
using namespace std;
int n,m,x,y,x1,y1,min_=99999999;
int book[100][100];//表示该数是否使用过
int a[100][100]; //用于存储迷宫
int next_[4][2]={{0,1},{1,0},{0,-1},{-1,0}}; //上下左右四个方向
int dfs(int x,int y,int stept){
if (x==x1&&y==y1){ //若已经到达终点,则更新当前的步骤值,然后返回当前状态。
if(min_>stept) min_=stept;
return 0;
}
for(int i=0;i<4;i++){ //枚举四个方向
int xt=x+next_[i][0];
int yt=y+next_[i][1]; //计算下一步的x和y坐标
if(xt<1||xt>n||yt<1||yt>m) continue; //判断是否越界
if(a[xt][yt]==0&&book[xt][yt]==0){ //空地且没有被标记过
book[xt][yt]=1; // 标记一下
dfs(xt,yt,stept+1); //走下一步
book[xt][yt]=0; //返回时,把标记过的从新设置为未标记
}
}
return 0;
}
int main(){
//数据读入
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%d",&a[i][j]);
}
}
scanf("%d %d %d %d",&x,&y,&x1,&y1);
book[x][y]=1; //把起始位置设置为已经标记走过
dfs(x,y,0); //从起始位置开始寻找 ,初始步数是0
printf("%d",min_);
return 0;
}
输入
5 4
0 0 1 0
0 0 0 0
0 0 1 0
0 1 0 0
0 0 0 1
1 1 4 3
输出
7