在这个m*m(m<=100)的迷宫里,用’0‘表示障碍,‘1’表示空地,’#‘表示出口,如果能从起始地点走到出口,输出最短路径,否则输出impossible。
#include <iostream>
using namespace std;
char a[100][100],book[100][100]; //book数组用于记录
int startx,starty,m; //分别为起始的x和y坐标和地图的边长
long long minn=99999999999999; //储存一个我们认为的正无穷值
void dfs(int x,int y,int step) //step表示当前的步数
{
int next[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; //定义方向数组
if(a[x][y]!='0' && a[x][y]!='#')
{
for(int i=0;i<=3;i++)
{
int tx=x+next[i][0];
int ty=y+next[i][1];
if(tx>m-1 || ty>m-1 || tx<0 || ty<0) //如果超出就跳过
{
continue;
}
if(a[tx][ty]!='0' && book[tx][ty]!='0')
{
book[tx][ty]='0'; //标记这个点,避免重复走
dfs(tx,ty,step+1); //继续下一步
book[tx][ty]='1'; //取消标记
}
}
}
else
{
if(step<minn && a[x][y]=='#') //如果到达终点且步数比之前的小
{
minn=step; //更新minn的值
}
}
return;
}
int main()
{
cin>>startx>>starty>>m; //输入起始坐标和地图边长
for(int i=0;i<m;i++)
{
for(int j=0;j<m;j++)
{
cin>>a[i][j]; //输入地图
}
}
dfs(startx-1,starty-1,0); //开始搜索(这里因为数组的起始下标为0,所以startx和starty都要减一)
if(minn!=99999999999999) //如果minn被更新过就说明存在路径(也就是说有最短路径)
{
cout<<minn;
}
else
{
cout<<"impossible";
}
return 0;
}