bfs

 

 

 

 

#include <cstdio>

#include <queue>

#include <utility>//pair

using namespace std;

 

typedef pair<int, int> pii;

const int N = 405;

 

int d[N][N];

 

int main() {

    int n, m, a, b;

    scanf("%d%d%d%d", &n, &m, &a, &b);

    a--, b--;

 

    for (int i = 0; i < n; ++i) {

        for (int j = 0; j < m; ++j) {

            d[i][j] = -1;

        }

    }

    d[a][b] = 0;

 

    queue<pii> q;

    q.push(pii(a, b));

    while (!q.empty()) {

        pii p = q.front();//包括下面一行,这两行是bfs的核心

        q.pop();//后弹出,因为之前只是取出,并没有弹出

        int x = p.first, y = p.second;

        int dx[] = {-2, -1, 1, 2, 2, 1, -1, -2};

        int dy[] = {1, 2, 2, 1, -1, -2, -2, -1};

        for (int i = 0; i < 8; ++i) {

            int nx = x + dx[i], ny = y + dy[i];

            if (0 <= nx && nx < n && 0 <= ny && ny < m && d[nx][ny] == -1) {

                d[nx][ny] = d[x][y] + 1;

                q.push(pii(nx, ny));//把这个点衍生的所有点推入队列

            }

        }

    }

 

    for (int i = 0; i < n; ++i) {

        for (int j = 0; j < m; ++j) {

            printf("%-5d", d[i][j]);

        }

        puts("");

    }

}

posted @ 2021-02-03 07:42  py佐料  阅读(49)  评论(0编辑  收藏  举报