马的遍历
题目描述
有一个 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 1≤x≤n≤400, 1 ≤ y ≤ m ≤ 400 1 \leq y \leq m \leq 400 1≤y≤m≤400。
将vector容器放在全局变量里会占用大量内存
#include<bits/stdc++.h>
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;
}