迷宫是一个n*m的矩阵,玩家需要迷宫入口(坐标1,1)出发,寻找路径走到出口(n,m)。
请判断玩家能否从迷宫中走出,如果能走出迷宫输出,输出最短的路径长度,否则输出-1。
输入格式
第一行两个整数n和m,代表n行m列。(1<=n,m<=10)
下面n行每行m个字符,0代表可以通行,1代表不可以通行。
输出格式
如果能从迷宫走出,输出最短的路径长度,否则输出-1。
输入样例
8 8
00100010
00100010
00001100
01110000
00010000
01000100
01110110
00001000
输出样例
16
//参考自@麦克老师讲算法
//这题最**的地方就是矩阵是字符
BFS
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
char s[12][12];
int d[4][2]={{1,0},{0,1},{0,-1},{-1,0}};
int v[12][12];
struct point
{
int x;int y;int step;
};
int main ()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
{
scanf("%s",s[i]);
}
queue<point> r;//申请队列
struct point start;
start.x=0;
start.y=0;
start.step=0;
r.push(start);
v[0][0]=1;
while(!r.empty())
{
if(r.front().x==n-1&&r.front().y==m-1)
{
printf("%d\n",r.front().step);
return 0;
}
for(int i=0;i<4;i++)
{
int x=r.front().x+d[i][0];
int y=r.front().y+d[i][1];
int step=r.front().step+1;
if(x<0||y<0||x>=n||y>=m||s[x][y]=='1'||v[x][y]==1)
{
continue;
}
v[x][y]=1;
start.x=x;
start.y=y;
start.step=step;
r.push(start);
}
r.pop();
}
printf("-1\n");
}