马的遍历(洛谷)

    科技2022-07-16  129

    题目描述 有一个 n * m 的棋盘,在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步

    输入格式 一行四个数据,棋盘的大小和马的坐标

    输出格式 一个 n * m 的矩阵,代表马到达某个点最少要走几步(左对齐,宽5格,不能到达则输出-1)

    输入样例 3 3 1 1

    输出样例 0 3 2 3 -1 1 2 1 4

    数据范围 1 < n, m ≤ 400


    题解 BFS:

    #include <iostream> #include <cstring> #include <cstdio> #include <queue> #define x first #define y second using namespace std; typedef pair<int, int > PII; const int N = 410; int n, m, S, E; int dist[N][N]; int dx[8] = {1, 1, -1, -1, 2, 2, -2, -2}; int dy[8] = {2, -2, 2, -2, 1, -1, 1, -1}; void bfs(int x, int y) { queue<PII> q; q.push(make_pair(x, y)); dist[x][y] = 0; while(q.size()) { PII t = q.front(); q.pop(); for (int i = 0; i < 8; i ++) { int a = t.x + dx[i], b = t.y + dy[i]; if(a < 1 || a > n || b < 1 || b > m || dist[a][b] != -1) continue; q.push(make_pair(a, b)); dist[a][b] = dist[t.x][t.y] + 1; } } } int main() { memset(dist, -1, sizeof dist); cin >> n >> m >> S >> E; bfs(S, E); for (int i = 1; i <= n; i ++) { for (int j = 1; j <= m; j ++) printf("%-5d", dist[i][j]); cout << endl; } return 0; }

    ps:这道题帮我复习了左对齐🤣

    Processed: 0.009, SQL: 8