深度搜索:
深度搜索的方法:
(1)访问顶点v;
(2)依次从v的未被访问的邻接点出发,对图进行深度优先遍历;直至图中和v有路径相通的顶点都被访问;
(3)若此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优先遍历,直到图中所有顶点均被访问过为止。 当然,当人们刚刚掌握深度优先搜索的时候常常用它来走迷宫.
例题:迷宫问题
有一天,傻子A一个人去迷宫玩,但是他的方向感并不是很好,所以他很快就迷路了,哎哟喂,这可把他的小伙伴小Z给急死了,小Z得知后立即去解决傻子A,小Z来之前,做足了调研,弄到了迷宫的地图,现在问题来了:小Z要用最快的速度去解救傻子A。小Z拥有的地图是一个n行m列的单元格(0< n , m <= 50),单元格上要么是空地,要么是障碍物,我们的任务是帮小Z找一条从迷宫起点,通往小Z所在位置的最短路径,注意:障碍物时不能走的!小A时不动的,规定0表示空地、1表示障碍物,2表示傻子A所在的坐标。
样例输入:
5 4
0 0 1 0
0 0 0 0
0 0 1 0
0 1 2 0
0 0 0 1
样例输出:
7
代码表示:
#include<iostream>
#define MAXN 51
using namespace std;
int map[MAXN][MAXN]; //矩阵存储地图
bool book[MAXN][MAXN]={false}; //false用来标记此坐标是否被走过
int Endx,Endy; //终点坐标
int n,m; //n行m列
int minn=999999; //定义最小值为无限小大
int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}}; //按照顺序的四个方向
//三个参数 x,y,step 分别表示目前所在坐标与 当前执行了几步
void dfs(int x,int y,int step)
{
//遍历四种方向
for(int i=0;i<4;i++)
{
//计算新的坐标
int gx=x+next[i][0];
int gy=y+next[i][1];
//限制条件 已经走到终点
if(gx==Endx&&gy==Endy)
{
minn=min(step+1,minn);
return; //回溯
}
//判断坐标是否越界(超出图外)
if(gx<0||gx>n-1||gy<0||gy>m-1)
continue;
//判断该坐标是否已经走过,如果没有走过且为空地,则执行
if(book[gx][gy]==false&&map[gx][gy]==0)
{
//当下该怎么做?
book[gx][gy]=true; //标记已经走过
//继续下一步
dfs(gx,gy,step+1); //传入新坐标,步数加一
book[gx][gy]=false; //回溯回来,取消标记
}
}
return;
}
int main()
{
//地图的输入
cin >> n >> m;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
cin >> map[i][j];
//地图中有且仅有一个2 代表终点坐标
if(map[i][j]==2)
Endx=i,Endy=j; //给终点坐标赋值
}
//开始遍历
book[0][0]=true;
dfs(0,0,0);
cout << minn << endl;
return 0;
}