深度搜索

深度搜索:
在这里插入图片描述深度搜索的方法:
(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;
 } 
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值