- #include <iostream>
- #include <queue>
- using namespace std;
- #define M 400
- int arr[M + 5][M + 5];
- typedef struct Node {
- int x, y;
- } Node;
- //将马能走的8个方向封装成一个二维数组
- int dir[8][2] = {
- {2, 1}, {2, -1}, {-2, 1}, {-2, -1},
- {1, 2}, {-1, 2}, {1, -2}, {-1, -2}};
- void fun(int x, int y, int n, int m) {
- Node node;
- node.x = x, node.y = y;
- arr[x][y] = 0;
- queue<Node> q;
- q.push(node);
- //广搜
- while (!q.empty()) {
- int indx = q.front().x, indy = q.front().y;
- q.pop();
- for (int i = 0; i < 8; i++) {
- int x1 = indx + dir[i][0];
- int y1 = indy + dir[i][1];
- if (x1 < 1 || x1 > n) continue;
- if (y1 < 1 || y1 > m) continue;
- //遍历过了就直接跳过,因为是广搜,所以当前一定不如之前更优
- if (arr[x1][y1] != -1) continue;
- arr[x1][y1] = arr[indx][indy] + 1;
- Node n;
- n.x = x1, n.y = y1;
- q.push(n);
- }
- }
- return;
- }
- int main() {
- int n, m, x, y;
- cin >> n >> m >> x >> y;
- for (int i = 1; i <= n; i++) {
- for (int j = 1; j <= m; j++) {
- //先每行初始化-1
- arr[i][j] = -1;
- }
- }
- fun(x, y, n, m);
- for (int i = 1; i <= n; i++) {
- for (int j = 1; j <= m; j++) {
- cout << arr[i][j] << " ";
- }
- cout << endl;
- }
- return 0;
- }