Mud Puddles ( bfs )

傳送門

題目

題解

直接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;
}