一个N*M的迷宫矩阵由0和1组成,1表示墙壁,0表示通路。
一只小老鼠从左上角即坐标(1,1)出发,只能走上下左右四个方向(不能走斜线),问小老鼠能否吃到右下角出口即坐标(N,M)处的奶酪。
M,N<=2000
输入
第一行输入空格分开的两个整数N,M,表示迷宫的行数和列数
然后输入N行M列的迷宫矩阵
输出
若能走到出口,输出“yes”,否则输出“no”
样例输入
5 5
0 0 1 0 1
0 0 1 0 0
0 1 0 1 1
0 1 0 0 0
0 0 0 0 0
样例输出
yes
#include <bits/stdc++.h>
using namespace std;
int n,m;
int q[4010010][3];
int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1};
bool vis[2010][2010];
char maps[2010][2010];
int front,rear;
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
cin>>maps[i][j];
front=rear=1;
q[1][0]=1;
q[1][1]=1;
q[1][2]=1;
vis[1][1]=true;
while(front<=rear)
{
int fy=q[front][1];
int fx=q[front][0];
for(int i=0;i<4;i++)
{
int nx=fx+dx[i];
int ny=fy+dy[i];
if(nx>=1 && nx<=n && ny>=1 && ny<=n && !vis[nx][ny] && maps[nx][ny]=='0')
{
rear++;
q[rear][0]=nx;
q[rear][1]=ny;
q[rear][2]=q[front][2]+1;
vis[nx][ny]=true;
if(nx==m && ny==n)
{
cout<<"yes";
return 0;
}
}
}
front++;
}
cout<<"no";
return 0;
}