有一天,小哈一个人去玩迷宫。但是方向感不好的小哈很快就迷路了。小哼得知后便去解救无助的小哈。此时的小哼已经弄清楚了迷宫的地图,现在小哼要以最快的速度去解救小哈。那么,问题来了...
输入 5 4 |
输出 7 |
输入 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;
}