rt!
#include <cstdio>
#include <cstring>
#include <queue>
struct Node
{
int x;
int y;
int step;
};
bool vis[401][401];
const int dir[8][2] = {{-1, -2}, {-2, -1}, {-2, 1}, {-1, 2}, {1, 2}, {2, 1}, {2, -1}, {1, -2}};
int n, m, x, y;
int bfs(int fx, int fy);
int main(void)
{
scanf("%d %d %d %d", &n, &m, &x, &y);
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
printf("%-5d ", bfs(i, j));
}
putchar('\n');
}
return 0;
}
int bfs(int fx, int fy)
{
std::queue <Node> q;
memset(vis, 0, sizeof vis);
q.push(Node{x, y, 0});
vis[x][y] = true;
while (!q.empty())
{
Node f = q.front();
q.pop();
if (f.x == fx && f.y == fy)
{
return f.step;
}
for (int i = 0; i < 8; i++)
{
int tx = f.x + dir[i][0];
int ty = f.y + dir[i][1];
if (0 < tx && tx <= n && 0 < ty && ty <= m && !vis[tx][ty])
{
vis[tx][ty] = true;
q.push(Node{tx, ty, f.step + 1});
}
}
}
return -1;
}