/* ID: tageorg1 PROG: mud LANG: C++ */ #include #include #include #include #include #include #include #include using namespace std; int mid=500; int offset=500; short field[1001][1001]; int amax = 1001; //0=empty,-1=mud typedef struct { short x,y,length; } point; int main() { FILE* fin = fopen("mud.in","r"); FILE* fout = fopen("mud.out","w"); int X,Y,N; fscanf(fin,"%d%d%d",&X,&Y,&N); for (int n = 0; n < N; n++) { int x,y; fscanf(fin,"%d%d",&x,&y); x+=offset; y+=offset; if (x >= 0 && x < amax && y >= 0 && y < amax) field[x][y]=-1; } queue tq; point start; start.x=mid; start.y=mid; start.length=0; tq.push(start); while (!tq.empty()) { point cpoint = tq.front(); tq.pop(); int cx = cpoint.x; int cy = cpoint.y; int clength = cpoint.length; if (cx < 0 || cx >=amax || cy < 0 || cy >=amax) continue; if (field[cx][cy]!=0) continue; if (cx==X+offset && cy==Y+offset) { field[cx][cy]=clength; break; } //left if (cx-1 > 0 && field[cx-1][cy]==0) { point left; left.x=cx-1; left.y=cy; left.length=clength+1; tq.push(left); } //right if (cx+1 <= amax && field[cx+1][cy]==0) { point right; right.x=cx+1; right.y=cy; right.length=clength+1; tq.push(right); } //up if (cy+1 <= amax && field[cx][cy+1]==0) { point up; up.x=cx; up.y=cy+1; up.length=clength+1; tq.push(up); } //down if (cy-1>0 && field[cx][cy-1]==0) { point down; down.x=cx; down.y=cy-1; down.length=clength+1; tq.push(down); } } fprintf(fout,"%d\n",field[X+offset][Y+offset]); }