grasshop.cpp
#include <stdio.h>
#define NOT_VISITED 2000
using namespace std;
int main(){
int W, H, SX, SY, EX, EY;
int HX[8] = {1,1,-1,-1,2,2,-2,-2};
int HY[8] = {2,-2,2,-2,1,-1,1,-1};
while (scanf("%d %d %d %d %d %d", &W, &H, &SX, &SY, &EX, &EY) == 6){
int QP = 0;
int QL = 1;
int QX[1010];
int QY[1010];SX--;SY--;EX--;EY--;
QX[0] = SX; QY[0] = SY;
int field[102][102];
for(int i = 0; i < W; i++){
for(int j = 0; j < H; j++){
field[i][j] = NOT_VISITED;
}
}
field[SX][SY] = 0;
int can_finish = -1;
while(QP < QL){
for(int i = 0; i < 8; i++){
int nx = QX[QP] + HX[i];
int ny = QY[QP] + HY[i];
if(nx >= 0 && ny >= 0 && nx < W && ny < H && field[nx][ny] == NOT_VISITED){
field[nx][ny] = field[QX[QP]][QY[QP]] +1;
QX[QL] = nx;
QY[QL] = ny;
QL++;
}
}
if(field[EX][EY] != NOT_VISITED){
can_finish = field[EX][EY];
break;
}
QP++;
}
if(can_finish > -1){
printf("%d\n", can_finish);
}else{
printf("impossible\n");
}
}
return 0;
}