Go to diff to previous submission
#include <cstdio> #define MAX 10100 int qx[MAX]; int qy[MAX]; int qb,qe; int n; int visited[110][110]; int mx,my,gx,gy,lx,ly,resx,resy; bool jumpUUR(int xx,int yy){ int x = xx+1; int y = yy+2; if((x == lx) && (y == ly)){ visited[x][y] = visited[xx][yy]+1 ; resx = x; resy = y; return true; } if((x <= mx ) && (y <= my)){ if(visited[x][y] == -1){ visited[x][y] = visited[xx][yy]+1 ; qx[qe]=x; qy[qe++]=y; } } return false; } bool jumpURR(int xx,int yy){ int x = xx+2; int y = yy+1; if((x == lx) && (y == ly)){ visited[x][y] = visited[xx][yy]+1 ; resx = x; resy = y; return true; } if((x <= mx ) && (y <= my)){ if(visited[x][y] == -1){ visited[x][y] = visited[xx][yy]+1 ; qx[qe]=x; qy[qe++]=y; } } return false; } bool jumpUUL(int xx,int yy){ int x = xx-1; int y = yy+2; if((x == lx) && (y == ly)){ visited[x][y] = visited[xx][yy]+1 ; resx = x; resy = y; return true; } if((x > 0 ) && (y <= my)){ if(visited[x][y] == -1){ visited[x][y] = visited[xx][yy]+1 ; qx[qe]=x; qy[qe++]=y; } } return false; } bool jumpULL(int xx,int yy){ int x = xx-2; int y = yy+1; if((x == lx) && (y == ly)){ visited[x][y] = visited[xx][yy]+1 ; resx = x; resy = y; return true; } if((x > 0 ) && (y <= my)){ if(visited[x][y] == -1){ visited[x][y] = visited[xx][yy]+1 ; qx[qe]=x; qy[qe++]=y; } } return false; } bool jumpDLL(int xx,int yy){ int x = xx-2; int y = yy-1; if((x == lx) && (y == ly)){ visited[x][y] = visited[xx][yy]+1 ; resx = x; resy = y; return true; } if((x > 0 ) && (y > 0)){ if(visited[x][y] == -1){ visited[x][y] = visited[xx][yy]+1 ; qx[qe]=x; qy[qe++]=y; } } return false; } bool jumpDDL(int xx,int yy){ int x = xx-1; int y = yy-2; if((x == lx) && (y == ly)){ visited[x][y] = visited[xx][yy]+1 ; resx = x; resy = y; return true; } if((x > 0 ) && (y > 0)){ if(visited[x][y] == -1){ visited[x][y] = visited[xx][yy]+1 ; qx[qe]=x; qy[qe++]=y; } } return false; } bool jumpDDR(int xx,int yy){ int x = xx+1; int y = yy-2; if((x == lx) && (y == ly)){ visited[x][y] = visited[xx][yy]+1 ; resx = x; resy = y; return true; } if((x <= mx ) && (y > 0)){ if(visited[x][y] == -1){ visited[x][y] = visited[xx][yy]+1 ; qx[qe]=x; qy[qe++]=y; } } return false; } bool jumpDRR(int xx,int yy){ int x = xx+2; int y = yy-1; if((x == lx) && (y == ly)){ visited[x][y] = visited[xx][yy]+1 ; resx = x; resy = y; return true; } if((x <= mx ) || (y > 0)){ if(visited[x][y] == -1){ visited[x][y] = visited[xx][yy]+1 ; qx[qe]=x; qy[qe++]=y; } } return false; } bool enqueue(){ int x,y; x = qx[qb]; y = qy[qb++]; if(jumpUUR(x,y)) return true; if(jumpURR(x,y)) return true; if(jumpDRR(x,y)) return true; if(jumpDDR(x,y)) return true; if(jumpDDL(x,y)) return true; if(jumpDLL(x,y)) return true; if(jumpULL(x,y)) return true; if(jumpUUL(x,y)) return true; return false; } int main(int argc, char ** argv) { while(scanf("%d %d %d %d %d %d",&mx,&my,&gx,&gy,&lx,&ly) == 6){ qb = qe = 0; qx[qe] = gx; qy[qe++] = gy; n = 0; for(int i=1;i<=100;i++) for(int ii=1;ii<=100;ii++) visited[i][ii]= -1; visited[gx][gy]=n; while(1){ if(qb == qe){ printf("impossible\n"); break; } if(enqueue() == true){ printf("%d\n",visited[resx][resy]); break; } } } return 0; }