一個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;
}