#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAKE_QUEUE(name, sz, value_type) \
struct {size_t size; size_t start; size_t stop; value_type *vals; } name; \
name.size = sz + 1; \
name.start = sz; \
name.stop = 0; \
name.vals = (value_type*) malloc(sizeof(value_type) * name.size);
#define enq(name, val) \
(name.vals[name.stop] = val, name.stop = (name.stop + 1) % name.size)
#define deq(name) \
(name.start = (name.start + 1) % name.size, name.vals[name.start])
#define empty(name) \
((name.start + 1) % name.size == name.stop)
typedef struct {
int node;
int distance;
} dijkstra_node;
int key(dijkstra_node n) {
return -n.distance;
}
template <typename G>
void dijkstra(G graph, int start, int end) {
MAKE_QUEUE(queue, vertices(graph), dijkstra_node);
dijkstra_node node = {start, 0};
enq(queue, node);
while (!empty(queue)) {
node = deq(queue);
if (node.node == end) {
printf("%d\n", node.distance);
return;
}
dijkstra_node neighbor;
while (visit_neighbor(graph, node.node, &neighbor.node)) {
neighbor.distance = node.distance + 1;
enq(queue, neighbor);
}
}
printf("impossible\n");
}
typedef struct {
int rows;
int cols;
bool *visited;
} chessboard_t;
chessboard_t *createBoard(int rows, int cols) {
chessboard_t *b = (chessboard_t *) malloc(sizeof(chessboard_t));
b->rows = rows;
b->cols = cols;
b->visited = (bool*) malloc(sizeof(bool) * rows * cols);
memset(b->visited, 0, sizeof(bool) * rows * cols);
return b;
}
int vertices(chessboard_t *b) {
return b->rows * b->cols;
}
#define node(b, row, col) ((row) * (b)->cols + (col))
bool visit_field(chessboard_t *b, int row, int col, int *neighbor) {
if (row < 0 || row >= b->rows || col < 0 || col >= b->cols) {
return false;
}
int node = node(b, row, col);
*neighbor = node;
if (b->visited[node]) {
return false;
}
b->visited[node] = true;
return true;
}
bool visit_neighbor(chessboard_t *b, int node, int *neighbor) {
int row = node / b->cols;
int col = node % b->cols;
return
visit_field(b, row-2, col-1, neighbor) ||
visit_field(b, row-2, col+1, neighbor) ||
visit_field(b, row-1, col-2, neighbor) ||
visit_field(b, row-1, col+2, neighbor) ||
visit_field(b, row+1, col-2, neighbor) ||
visit_field(b, row+1, col+2, neighbor) ||
visit_field(b, row+2, col-1, neighbor) ||
visit_field(b, row+2, col+1, neighbor);
}
int main(void) {
int R, C, Gr, Gc, Lr, Lc;
while (scanf(" %d %d %d %d %d %d", &R, &C, &Gr, &Gc, &Lr, &Lc) == 6) {
chessboard_t *b = createBoard(R, C);
int ghopper = node(b, Gr-1, Gc-1);
int clover = node(b, Lr-1, Lc-1);
b->visited[ghopper] = true;
dijkstra(b, ghopper, clover);
}
return 0;
}