题目
题解
直接bfs就行,有个坑点要注意:因为坐标存在负数,所以可以把所有点都+500转化为正数去做。
Code
#include<bits/stdc++.h> #define debug1(x) cout<<#x<<"="<<x<<endl #define debug2(x,y) cout<<#x<<"="<<x<<' '<<#y<<"="<<y<<endl using namespace std; const int maxn=1e4+10; typedef long long ll; int x,y,N,a[maxn],b[maxn]; bool book[1005][1005]; struct node { int x,y,mindis; }que[1000008]; int bfs(int qx,int qy,int zx,int zy)//qx,qy为起点坐标,zx,zy为终点坐标 { int next[4][2]={{0,1},{0,-1},{1,0},{-1,0}}; int head=1,tail=1,tx,ty,qq=0; que[tail].x=qx,que[tail].y=qy,que[tail++].mindis=0; book[qx][qy]=1; while(head<tail){ for(int i=0;i<4;i++){ tx=que[head].x+next[i][1]; ty=que[head].y+next[i][0]; if(tx<0||ty<0||tx>1000||ty>1000)continue; if(!book[tx][ty]){ book[tx][ty]=1; que[tail].x=tx,que[tail].y=ty; que[tail].mindis=que[head].mindis+1; tail++; } if(tx==zx&&ty==zy){ qq=1; break; } } if(qq)break; head++; } return que[tail-1].mindis; } int main() { ios::sync_with_stdio(false); cin>>x>>y>>N; x+=500,y+=500; for(int i=1;i<=N;++i){ cin>>a[i]>>b[i]; book[a[i]+500][b[i]+500]=1; } int ans=bfs(500,500,x,y); cout<<ans<<endl; return 0; }