grasshop.cpp
#include <queue>
#include <cstdio>
#include <utility>
using namespace std;
int jumps[8][2] = {{1,2},{2,1},{-1,2},{-2,1},{1,-2},{2,-1},{-1,-2},{-2,-1}};
int main(void){
int r,c,gr,gc,lr,lc;
int pole[100][100];
while (scanf("%d %d %d %d %d %d",&r,&c,&gr,&gc,&lr,&lc)==6){
queue<pair<int,int> > Q;
gr--;
gc--;
lc--;
lr--;
Q.push(pair<int,int>(gr,gc));
for (int i = 0; i<r; i++){
for (int j = 0; j<c; j++){
pole[i][j]=100000;
}
}
pole[gr][gc]=0;
while(!Q.empty()){
pair<int,int> p = Q.front();
Q.pop();
for (int i=0; i<9; i++){
int x =p.first+jumps[i][0];
int y =p.second+jumps[i][1];
if ((x>=0 && y >=0 && x <r && y <c)&& (pole[x][y]>pole[p.first][p.second]+1)){
Q.push(pair<int,int>(x,y));
pole[x][y]=pole[p.first][p.second]+1;
if (x == lr && y == lc)
goto konec;
}
}
}
konec:
if (pole[lr][lc]== 100000)
printf("impossible\n");
else
printf("%d\n", pole[lr][lc]);
}
}