骑士的移动
经典的BFS,但是统计从起点到终点需要多少步的话要思考一下,每次扩展到新方块的时候,新方块到起点的步数是在当前出队的方块到起点的距离+1,这是一个类似于迭代的过程??体会一下吧。。
#include <iostream>
#include <cstdio>
#include <string>
#include <queue>
#include <cstring>
using namespace std;
struct point {
int x;
int y;
point(int x, int y) : x(x), y(y) {}
};
// 用step数组记录棋盘上每个方块从起点开始走出的步数
int step[8][8];
// 骑士有八个方向可以走
int dr[8] = {-2, -1, 1, 2, -2, -1, 1, 2};
int dc[8] = {-1, -2, -2, -1, 1, 2, 2, 1};
int bfs(point s, point d) {
queue<point> q;
q.push(s);
step[s.x][s.y] = 0;
while (!q.empty()) {
point u = q.front();
q.pop();
if (u.x == d.x && u.y == d.y) break;
for (int i = 0; i < 8; i++) {
int dx = u.x + dr[i];
int dy = u.y + dc[i];
if (dx >= 0 && dx <= 7 && dy >= 0 && dy <= 7 && step[dx][dy] < 0) {
q.push(point(dx, dy));
// 对于当前方块可以移动到的方块,从起点走出的步数要在当前方块的基础上+1
step[dx][dy] = step[u.x][u.y] + 1;
}
}
}
return step[d.x][d.y];
}
int main() {
string start, dest;
while (cin >> start >> dest) {
memset(step, -1, sizeof(step));
int x1 = start[1] - '0' - 1;
int y1 = start[0] - 'a';
int x2 = dest[1] - '0' - 1;
int y2 = dest[0] - 'a';
point s(x1, y1);
point d(x2, y2);
int ans = bfs(s, d);
printf("To get from %s to %s takes %d knight moves.\n", start.c_str(), dest.c_str(), ans);
}
return 0;
}