grasshop.cpp
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int dir[8][2] = {{1, 2}, {2, 1}, {2, -1}, {1, -2}, {-1, -2}, {-2, -1}, {-2, 1}, {-1, 2}};
struct point{
point(int x_, int y_){x = x_; y = y_;}
int x, y;
};
int main(){
int R, C, Sy, Sx, Cy, Cx;
while(cin >> R >> C >> Sy >> Sx >> Cy >> Cx){
if(Sy == Cy && Sx == Cx){
cout << 0 << '\n';
continue;
}
vector<vector<int> > pole(R+1, vector<int> (C+1));
queue<point> Q;
Q.push(point(Sx, Sy));
while(!Q.empty()){
point p = Q.front();
Q.pop();
for(int i=0; i<8; ++i){
int x = p.x + dir[i][0];
int y = p.y + dir[i][1];
if(x > 0 && x <= C && y > 0 && y <= R){
if(pole[x][y] == 0){
Q.push(point(x, y));
pole[x][y] = pole[p.x][p.y] + 1;
if(x == Cx && y == Cy){
cout << pole[x][y] << '\n';
goto LOOP;
}
}
}
}
}
cout << "impossible\n";
LOOP:;
}
return 0;
}