解救小哈——DFS算法举例

有一天,小哈一个人去玩迷宫。但是方向感不好的小哈很快就迷路了。小哼得知后便去解救无助的小哈。此时的小哼已经弄清楚了迷宫的地图,现在小哼要以最快的速度去解救小哈。那么,问题来了...

输入

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

输入

3 3
1 1 1 
0 1 0 
0 1 0 
2 1 3 3

输出

No Way!

思路:走过每一条可能找到小哈的路径选出最短的一条,即遍历所有路径,记录minstep。

用二维数组存储迷宫,再用二维数组建立一个移动键。

dfs()需要控制三个参数,当前坐标x,y与当前所走步数。

#include <iostream>
using namespace std;	
int n,m;
int hax,hay;
int minstep=9999;
const int MAX=105;
int str[MAX][MAX];               //初始迷宫
int vis[MAX][MAX];               //记录迷宫 
void dfs(int x,int y,int step)
{
	int next[4][2]={{0,1},//向上走
	                {0,-1},//向下走
		     		{-1,0},//向左走
		    		{1,0}//向右走
		     	   };
	if(x==hax&&y==hay)            //判断是否到达小哈的坐标 
	{
		step<minstep?minstep=step:minstep=minstep;
		return ;
	}
	int tx,ty;                     //移动后坐标 
	for(int i=0;i<4;i++)
	{
		tx=x+next[i][0];            //+移动坐标 
		ty=y+next[i][1];            //+移动坐标 
		if(tx<1||tx>n||ty<1||ty>m)  //判断越界 
		{
			continue;                //越界 
		}
		if(str[tx][ty]==0&&vis[tx][ty]==0)     //判断是否为障碍,是否已经走过 
		{
			vis[tx][ty]=1;            //标记走过 
			dfs(tx,ty,step+1);        //执行下一步 
			vis[tx][ty]=0;            //最后取消标记 
		}
	}
	return ;
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)            //注意!这里从1开始输入 和  上面 tx<1相对应 
	{
		for(int j=1;j<=m;j++)
		{
			cin>>str[i][j];
		}
	}
	int startx,starty;               //初始坐标 
	cin>>startx>>starty>>hax>>hay;
	vis[startx][starty]=1;           //初始坐标标记为走过 
	dfs(startx,starty,0);            //从步数为0开始执行 
	cout<<minstep<<endl;             //若minstep=9999,说明没有可执行方案 
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_43678290/article/details/85845833