问题 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;
}