3626 Mud Puddles

問題概要

座標平面の原点から、(x,y)まで、格子点を通り移動する。
1回の移動は座標軸に平行に、ちょうど1の距離だけ動ける。


座標平面上には、m個の泥の点があり、それらの点には移動することができない。
ゴールまで辿り着く最小の移動回数を求めよ。

  • 500≦x,y≦500を満たす。

解法

泥の座標は-500から500なので、最悪でもその外側を通れば目的地に行ける。(それより外のマスを通る意味はない)


よって座標を501だけずらした後、幅優先をすればよい。

ソースコード

const int n=1003,dy[]={-1,0,1,0},dx[]={0,-1,0,1};
bool m[n][n],v[n][n];

int main(){
	int x,y,k,a,b; scanf("%d%d%d",&x,&y,&k);
	x+=501; y+=501;
	rep(i,k){
		scanf("%d%d",&a,&b);
		m[a+501][b+501]=1;
	}
	v[501][501]=1;
	queue<pair<int,int> > Q; Q.push(mp(0,501*n+501));
	while(!Q.empty()){
		int cx=Q.front().second/n,cy=Q.front().second%n,
		cc=Q.front().first; Q.pop();
		
		if(cx==x&&cy==y){
			printf("%d\n",cc); break;
		}
		
		rep(d,4){
			int nx=cx+dx[d],ny=cy+dy[d];
			if(nx<0||nx>=n||ny<0||ny>=n||v[nx][ny]||m[nx][ny])continue;
			v[nx][ny]=1; Q.push(mp(cc+1,nx*n+ny));
		}
	}
	return 0;
}