P1443马的遍历

马的遍历

题目描述

有一个 n × m n \times m n×m 的棋盘,在某个点 ( x , y ) (x, y) (x,y) 上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步。

输入格式

输入只有一行四个整数,分别为 n , m , x , y n, m, x, y n,m,x,y

输出格式

一个 n × m n \times m n×m 的矩阵,代表马到达某个点最少要走几步(不能到达则输出 − 1 -1 1)。

样例 #1

样例输入 #1

3 3 1 1

样例输出 #1

0    3    2    
3    -1   1    
2    1    4

提示

数据规模与约定

对于全部的测试点,保证 1 ≤ x ≤ n ≤ 400 1 \leq x \leq n \leq 400 1xn400 1 ≤ y ≤ m ≤ 400 1 \leq y \leq m \leq 400 1ym400

将vector容器放在全局变量里会占用大量内存

#include

using namespace std;

int n, m, x, y;

int X[] = {-2, -1, 1, 2, 2, 1, -1, -2};
int Y[] = {1, 2, 2, 1, -1, -2, -2, -1};

void bfs(vector<vector<int>>& result)
{
    queue<pair<int, int>> q;
    q.push({x, y});
    result[x][y] = 0;

    while (!q.empty())
    {
        int dx = q.front().first;
        int dy = q.front().second;
        q.pop();

        for (int i = 0; i < 8; ++i)
        {
            int nx = dx + X[i];
            int ny = dy + Y[i];

            // 检查新位置是否在棋盘范围内,且未被访问过
            if (nx >= 1 && nx <= n && ny >= 1 && ny <= m && result[nx][ny] == -1)
            {
                result[nx][ny] = result[dx][dy] + 1;
                q.push({nx, ny});
            }
        }
    }
}

int main()
{

    cin >> n >> m >> x >> y;

    vector<vector<int>> result(n + 1, vector<int>(m + 1, -1));

    bfs(result);

    for (int i = 1; i <= n; ++i)
    {
        for (int j = 1; j <= m; ++j)
        {
            cout << result[i][j] << " ";
        }
        cout << endl;
    }

    return 0;
}

你可能感兴趣的:(蓝桥杯,算法,c++,蓝桥杯)