美文网首页
439 - Knight Moves

439 - Knight Moves

作者: 不会积 | 来源:发表于2017-04-05 23:13 被阅读0次
    Problem.png

    骑士的移动
    经典的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;
    }
    

    相关文章

      网友评论

          本文标题:439 - Knight Moves

          本文链接:https://www.haomeiwen.com/subject/tinxattx.html