//@author: yzj Date:2015/07/26
//sourse : http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82603#problem/C
//meaning: 马踏棋盘,求马从一个点到另一个点所走的最短路径
#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
const int MAXN = 300+5;
int n, sx, sy, ex, ey;
char ch_sy, ch_ey;
bool vis[MAXN][MAXN];
int step[MAXN][MAXN];
int dx[8] = {-1,1,2, 2, 1, -1, -2, -2};
int dy[8] = {2, 2,1, -1, -2, -2, -1, 1};
typedef pair<int, int> P;
int bfs()
{
queue<P> que;
while(!que.empty())
{
que.pop();
}
for(int i = 0; i < MAXN; i++)
{
for(int j = 0; j < MAXN; j++)
{
vis[i][j] = false;
step[i][j] = 0;
}
}
que.push(P(sx, sy));
vis[sx][sy] = true;
step[sy][sy] = 0;
while(! que.empty())
{
P p = que.front();
if(p.first == ex && p.second == ey) return step[p.first][p.second];
que.pop();
for(int i = 0; i < 8; i++)
{
int nx = p.first + dx[i], ny = p.second + dy[i];
if(0<=nx&&nx<n&&0<=ny&&ny<n&&!vis[nx][ny])
{
que.push(P(nx, ny));
vis[nx][ny] = true;
step[nx][ny] = step[p.first][p.second] + 1;
}
}
}
}
int main()
{
//freopen("f:/yzj/cppCode/input.txt", "r", stdin);
int cas;
scanf("%d", &cas);
while(cas--)
{
scanf("%d", &n);
scanf("%d %d %d %d", &sx, &sy, &ex, &ey);
printf("%d\n", bfs());
}
return 0;
}
POJ 3984-----E - 广搜记录路径 基础
最新推荐文章于 2021-04-03 10:35:33 发布