POJ Knight Move 1915
/*
* POJ_1915_Double BFS Knight Moves
*
* I really like this double bfs problem
*
* Author : a_clay 2014/05/06
*/
#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <queue>
#include <deque>
#include <map>
#include <algorithm>
using namespace std;
const int N = 305;
int steps[N][N];
int vis[N][N];
struct Point {
int x, y;
}st, ed;
int n;
bool ok(int x, int y) {
if (0 <= x && x < n && 0 <= y && y < n) {
return true;
}
return false;
}
int dx[] = {1, 1, -1, -1, 2, 2, -2, -2};
int dy[] = {2, -2, 2, -2, 1, -1, 1, -1};
deque<Point> Q;
int bfs() {
memset(steps, 0, sizeof(steps));
memset(vis, 0, sizeof(vis));
vis[st.x][st.y] = 1;
vis[ed.x][ed.y] = 2;
if (st.x == ed.x && st.y == ed.y) return 0; // 特殊数据优化
Q.clear();
Q.push_back(st);
Q.push_back(ed);
Point cur, nex;
int x0, y0, nx, ny;
while (!Q.empty()) {
cur = Q.front();
Q.pop_front();;
x0 = cur.x;
y0 = cur.y;
for (int i = 0; i < 8; i++) {
nx = x0 + dx[i];
ny = y0 + dy[i];
if (!ok(nx, ny)) continue;
if (vis[nx][ny] == 0) {
steps[nx][ny] = steps[x0][y0] + 1;
vis[nx][ny] = vis[x0][y0];
nex.x = nx;
nex.y = ny;
Q.push_back(nex);
}
else {
if (vis[nx][ny] != vis[x0][y0]) {
return steps[nx][ny] + steps[x0][y0] + 1;
}
}
}
}
return 0;
}
int main() {
int T;
cin >> T;
while (T--) {
scanf("%d", &n);
scanf("%d%d", &st.x, &st.y);
scanf("%d%d", &ed.x, &ed.y);
cout << bfs() << endl;
}
return 0;
}