跳马一样的题,更简单
#include <cstdio>
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
int dir[8][2] = { {-2, -1}, {-2, 1}, {-1, -2}, {-1, 2}, {1, -2}, {1, 2}, {2, -1}, {2, 1} };
int step[310][310];
bool visit[310][310];
int l, num;
typedef struct _node {
int x;
int y;
}Node;
Node a[310];
queue<Node> Q;
void init()
{
while (!Q.empty())
Q.pop();
memset(visit, false, sizeof(visit));
memset(step, 0, sizeof(step));
num = 0;
}
bool is_leagal(int x, int y)
{
if (x < 0 || x >= l || y < 0 || y >= l)
return false;
if (visit[x][y])
return false;
return true;
}
int bfs(Node begin, Node end)
{
Q.push(begin);
visit[begin.x][begin.y] = true;
while (!Q.empty()) {
Node top = Q.front();
Node tmp;
Q.pop();
for (int i = 0; i < 8; ++i) {
tmp.x = top.x + dir[i][0];
tmp.y = top.y + dir[i][1];
if (is_leagal(tmp.x, tmp.y) && !visit[tmp.x][tmp.y]) {
Q.push(tmp);
visit[tmp.x][tmp.y] = true;
step[tmp.x][tmp.y] = step[top.x][top.y] + 1;
if (tmp.x == end.x && tmp.y == end.y) return 1;
}
}
}
return 0;
}
int main()
{
int n = 0;
while (scanf("%d", &n) != EOF) {
for (int i = 0; i < n; ++i) {
scanf("%d", &l);
Node begin, end;
init();
scanf("%d%d", &begin.x, &begin.y);
scanf("%d%d", &end.x, &end.y);
if (bfs(begin, end))
printf("%d\n", step[end.x][end.y]);
else
printf("0\n");
}
}
}