grass.cpp
#include <algorithm>
#include <cctype>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstring>
#include <iomanip>
#include <iostream>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <utility>
#include <vector>
using namespace std;
#define DEBUG(x) cerr << ">>> " << #x << " : " << x << endl;
#define REP(i,a) for (int i = 0; i < (a); ++i)
#define FOR(i,a,b) for (int i = (a); i <= (b); ++i)
#define FORD(i,a,b) for (int i = (a); i >= (b); --i)
inline bool EQ(double a, double b) { return fabs(a-b) < 1e-9; }
const int INF = 1<<29;
typedef long long ll;
//////////////////////////////////
queue<int> qx, qy;
int dist[111][111];
int R, C;
void add(int x, int y, int d){
if(x >= 0 && y >= 0 && x < R && y < C && dist[x][y] == -1){
dist[x][y] = d;
qx.push(x);
qy.push(y);
}
}
int main() {
int Sx, Sy, Cx, Cy;
while(scanf("%d%d%d%d%d%d", &R, &C, &Sx, &Sy, &Cx, &Cy) != EOF){
Sx--; Sy--; Cx--; Cy--;
while(!qx.empty()){ qx.pop(); qy.pop(); }
REP(i, R) REP(j, C) dist[i][j] = -1;
add(Sx, Sy, 0);
while(!qx.empty()){
int x = qx.front(), y = qy.front();
qx.pop(); qy.pop();
if(x == Cx && y == Cy) break;
FOR(dx, -2, 2) FOR(dy, -2, 2) if(dx * dx + dy * dy == 5) add(x + dx, y + dy, dist[x][y] + 1);
}
if(dist[Cx][Cy] == -1) printf("impossible\n");
else printf("%d\n", dist[Cx][Cy]);
}
return 0;
}