深度优先搜索属于图算法的一种,是一个针对图和树的遍历算法,英文缩写为DFS即Depth First Search。深度优先搜索是图论中的经典算法,利用深度优先搜索算法可以产生目标图的相应拓扑排序表,利用拓扑排序表可以方便的解决很多相关的图论问题,如最大路径问题等等。一般用堆数据结构来辅助实现DFS算法。其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。
实现:1.需要一个方向(即在矩阵种,按某种方式进行寻找(顺时针或逆时针))。
2.回溯,寻找其他可能,进行比较。寻找最小路径。
问题:迷宫由m行n列的单元组成(m,n都小于50),每个单元格要么为空地,要么为障碍物。在此迷宫中,输入起始坐标和终点坐标,寻找从起点到终点的最短路径。(默认为无边界。)
输入:第一行输入m,n代表m行n列。
下面m行每行输入n个,代表迷宫。
之后输入起始坐标和重点坐标。
输出:起点坐标到重点坐标的最短路径。
实现:1.首先确定寻找方式,即顺序针寻找还是逆时针寻找。
2.确定后,对每次运动进行判断,即没没走过且不为障碍物即可走,不然就顺时针方向 走,直至走到终点处。
3.在第一次寻找到后,开始回溯,寻找其他路径,更新最短路径。
4.输出最短路径。
备注:对于迷宫,标记1为空,2为障碍。标记数组:0为未访问,1为已访问(即已走过。)(标记使用标记数组实现。)。2代表障碍。
测试样例:
5 4
1 1 2 1
1 1 1 1
1 1 2 1
1 2 1 1
1 1 1 2
1 1 4 3
输出结果:
代码:
#include<cstdio>
using namespace std;
int m,n,p,q,min=9999999;
int a[100][100]; //1为空,2为障碍。
int v[100][100];//0未,1访问
void dfs(int x,int y,int step){
if(x==p && y==q){
if(step<min)
min=step;
return;
}
//顺时针试探
//右
if(a[x][y+1]==1&&v[x][y+1]==0){
v[x][y+1]=1;
dfs(x,y+1,step+1);
v[x][y+1]=0;
}
//下
if(a[x+1][y]==1&&v[x+1][y]==0){
v[x+1][y]=1;
dfs(x+1,y,step+1);
v[x+1][y]=0;
}
//左
if(a[x][y-1]==1&&v[x][y-1]==0){
v[x][y-1]=1;
dfs(x,y-1,step+1);
v[x][y-1]=0;
}
//上
if(a[x-1][y]==1&&v[x-1][y]==0){
v[x-1][y]=1;
dfs(x-1,y,step+1);
v[x-1][y]=0;
}
return;
}
/*
5 4
1 1 2 1
1 1 1 1
1 1 2 1
1 2 1 1
1 1 1 2
1 1 4 3
*/
int main(){
int startx,starty;
scanf("%d%d",&m,&n);
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++)
scanf("%d",&a[i][j]);
}
scanf("%d%d%d%d",&startx,&starty,&p,&q);
v[startx][starty]=1;
dfs(startx,starty,0);
printf("%d",min);
return 0;
}