题目描述
给定一个 N\times MN×M 的网格迷宫 GG。GG 的每个格子要么是道路,要么是障碍物(道路用 11 表示,障碍物用 00 表示)。
已知迷宫的入口位置为 (x_1,y_1)(x1,y1),出口位置为 (x_2 , y_2)(x2,y2)。问从入口走到出口,最少要走多少个格子。
输入描述
输入第 11 行包含两个正整数 N,MN,M,分别表示迷宫的大小。
接下来输入一个 N\times MN×M 的矩阵。若 G_{i,j}=1Gi,j=1 表示其为道路,否则表示其为障碍物。
最后一行输入四个整数 x_1,y_1,x_2,y_2x1,y1,x2,y2,表示入口的位置和出口的位置。
1\leq N,M\leq10^21≤N,M≤102,0\leq G_{i,j}\leq 10≤Gi,j≤1,1\leq x_1,x_2\leq N1≤x1,x2≤N,1\leq y_1,y_2\leq M1≤y1,y2≤M。
输出描述
输出仅一行,包含一个整数表示答案。
若无法从入口到出口,则输出 -1−1。
输入输出样例
示例 1
输入
5 5
1 0 1 1 0
1 1 0 1 1
0 1 0 1 1
1 1 1 1 1
1 0 0 0 1
1 1 5 5
输出
8
运行限制
- 最大运行时间:1s
- 最大运行内存: 128M
#include<iostream> #include<algorithm> #include <utility> #include <queue> using namespace std; int x1,x2; int y1,y2; int d[4][2]={{0,1},{1,0},{-1,0},{0,-1}}; int sum=0; int a[105][105]; int n,m; int flag=0; int vis[105][105]={0}; void bfs(){ queue< pair<int,int> > q; q.push({x1,y1}); while(!q.empty()){ pair<int,int > t=q.front(); q.pop(); int tx=t.first,ty=t.second; sum=max(sum,vis[tx][ty]); if(tx==x2&&ty==y2){ flag=1; return ; } for(int i=0;i<4;i++){ int nx=tx+d[i][0],ny=d[i][1]+ty; if(nx>=n||nx<0||ny>=m||ny<0){ continue; } if(a[nx][ny]==1){ vis[nx][ny]=vis[tx][ty]+1; q.push({nx,ny}); a[nx][ny]=0; } } } return ; } int main() { cin>>n>>m; for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ cin>>a[i][j]; } } cin>>x1>>y1>>x2>>y2; x1--;x2--; y1--; y2--; bfs(); if(flag==1){cout<<sum<<endl; } else{ cout<<"-1"<<endl; } return 0; }