
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int MAXN = 400 + 5;
int n, l;
int xx, yy;
int map[MAXN][MAXN];
int dx[] = { 0, -1, -2, -1, -2, 1, 2, 1, 2}; // 方向
int dy[] = { 0, -2, -1, 2, 1, -2, -1, 2, 1};
int vis[MAXN][MAXN]; // 存步数,最后要输出的
struct Node
{
int x; // 坐标
int y;
int step; // 步数
};
struct Node queue[MAXN * MAXN];
void bfs(int tx, int ty) // 搜!
{
int head = 0, tail = 1, nx, ny;
queue[tail].x = tx;
queue[tail].y = ty;
queue[tail].step = 0;
vis[tx][ty] = queue[tail].step;
while(head < tail)
{
head++;
for(int i = 1; i <= 8; i++) // 枚举
{
nx = queue[head].x + dx[i];
ny = queue[head].y + dy[i];
if(nx >= 1 && nx <= n && ny >= 1 && ny <= l && vis[nx][ny] == -1)//判定范围
{
tail++;
queue[tail].x = nx;
queue[tail].y = ny;
queue[tail].step = queue[head].step + 1;
vis[nx][ny] = queue[tail].step;
}
}
}
}
int main()
{
cin >> n >> l;
cin >> xx >> yy;
for(int i = 1; i <= n; i++) // 初始化
for(int j = 1; j <= l; j++)
vis[i][j] = -1;
bfs(xx, yy);
for(int i = 1; i <= n; i++) // 输出,注意格式
{
for(int j = 1; j <= l; j++)
printf("%-5d",vis[i][j]);
cout << endl;
}
return 0;
}