sdf 2439 问题 A: 迷宫(广搜模板题)

问题 A: 迷宫(广搜模板题)

时间限制: 1 Sec  内存限制: 128 MB
提交: 203  解决: 63
[提交][状态][讨论版]

题目描述

现在有一个N×N的地图,问从起点(sx,sy)到(tx,ty)最少要走几步。

输入

第一行一个正整数N。

接下来N行,每行N个字符,表示N×N的0/1矩阵,1表示不能通过。0表示可以通过。

最后一行四个整数sx,sy,tx,ty.

输出

仅有一个数,表示答案。

样例输入

5
01111
00111
10001
11101
11100
1 1 5 5

样例输出

8


#include<cstdio>

#include<cstring>
#include<iostream>
#include<string>
#include<algorithm>
#include<queue>
using namespace std;

int n;
const int MAXN=1000;
int a[MAXN][MAXN];//存地图
int vis[MAXN][MAXN];//存标记
int dir[4][2] = {
    { -1, 0 }, { 0, 1 }, { 1, 0 }, { 0, -1 }
};

struct node {
    int x;
    int y;
    int len;
};

int sx,sy,tx,ty;

int bfs(int i, int j)
{
    queue<node> q;
    //找到一个队列头
    vis[i][j]=1;
    q.push({i, j, 0});

    //所有相关的全部入队搜索
    while(!q.empty())
    {
        auto f=q.front();
        q.pop();
        //找到
        if(f.x==tx && f.y==ty)
            return f.len;

        int nx,ny,nlen;
        for(int k=0;k<4;k++)
        {
            nx=f.x+dir[k][0];
            ny=f.y+dir[k][1];
            nlen=f.len+1;
            if(nx<0 || nx>=n || ny<0 || ny>=n)
                continue;
            if(a[nx][ny]==0 && !vis[nx][ny])
            {
                vis[nx][ny]=1;
                q.push({nx, ny, nlen});
            }
        }
    }
    //没找到
    return -1;
}

int main()
{  
    cin>>n;
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
        {
            char c;
            cin>>c;
            a[i][j]=c-'0';
        }
    cin>>sx>>sy>>tx>>ty;
    sx--;sy--;tx--;ty--;//坐标偏移1

    int len = bfs(sx,sy);
    cout<<len<<endl;

    return 0;
}



posted on 2021-10-19 14:58  katago  阅读(71)  评论(0编辑  收藏  举报