您的位置:首页 > 其它

BSF | 1915 | Knight Moves

2013-05-28 14:21 381 查看
跳马一样的题,更简单

POJ 1915 Knight Moves

#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");
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  BFS 搜索