天天看點

小老鼠走迷宮

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

}            

繼續閱讀