439 - Knight Moves

Problem.png

骑士的移动
经典的BFS,但是统计从起点到终点需要多少步的话要思考一下,每次扩展到新方块的时候,新方块到起点的步数是在当前出队的方块到起点的距离+1,这是一个类似于迭代的过程??体会一下吧。。

#include 
#include 
#include 
#include 
#include 
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 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;
}

你可能感兴趣的:(439 - Knight Moves)