NC214523. 会拐弯的眼睛
描述
输入描述
输入第一行六个正整数 n,m 描述地图大小,startx, starty, endx, endy 描述起点,终点。
保证
接下来 n 行,每行一个长度为 m 的 01 串,0 代表可以走的空地,1 代表不能走的墙壁
输出描述
输出一行一个正整数表示答案。
示例1
输入:
3 3 0 0 2 2 000 110 110
输出:
1
示例2
输入:
3 3 0 0 2 2 001 101 100
输出:
2
C++ 解法, 执行用时: 1333ms, 内存消耗: 425864K, 提交时间: 2022-03-01 16:01:27
#include<bits/stdc++.h> using namespace std; int sx,sy,n,m,ex,ey; char a[5010][5010]; int vis[5010][5010]; int dx[]={0, 1, 0, -1},dy[]={ 1, 0, -1, 0}; bool flag; struct Node { int x,y,c; }p; bool check(int x,int y) { if(x<0||x>=n||y<0||y>=m||vis[x][y]||a[x][y]=='1') return 0; //1 return 1; } void bfs() { queue<Node>q; q.push({sx,sy,0}); vis[sx][sy]=1; while(q.size()) { auto t=q.front(); q.pop(); for(int i=0;i<4;i++) { int tx=t.x,ty=t.y; while(1) { tx+=dx[i],ty+=dy[i]; if(tx==ex&&ty==ey) flag=1; if(!check(tx,ty)) break; vis[tx][ty]=t.c; q.push({tx,ty,t.c+1}); } } } return; } int main() { cin>>n>>m>>sx>>sy>>ex>>ey; for (int i=0;i<n;i++) scanf("%s",&a[i]); bfs(); if(flag) cout<<vis[ex][ey]<<endl; else puts("-1"); }