由于在 x,y 表示 x 行 y 列还是 y 行 x 列上存在歧义,另外提供一组测试数据:
// input:
5 5 2 3
// output:
1 2 3 2 1
2 3 0 3 2
1 2 3 2 1
4 1 2 1 4
3 2 3 2 3
可以说,这道题就是升级版的走迷宫问题,将起点随机化了、将每个点能走的方向增加到了8个,但实际上还是一样的做法。
走迷宫问题详解请看:走迷宫(BFS + 队列)-CSDN博客
#include<iostream>
#include<queue>
#include<string.h>
using namespace std;
const int N = 410;
int n,m,x,y;
int d[N][N];
bool v[N][N];
struct point{
int x;
int y;
point(int x1, int y1)
{
x = x1;
y = y1;
}
};
queue<point> q;
int dx[8] = {2, 2, -2, -2, 1, 1, -1, -1};
int dy[8] = {1, -1, -1, 1, 2, -2, -2, 2};
void bfs()
{
memset(d, -1, sizeof(d));
point start(x,y);
d[x][y] = 0;
v[x][y] = true;
q.push(start);
while(!q.empty())
{
point now = q.front();
int a = now.x;
int b = now.y;
int dis = d[a][b];
for(int i=0;i<8;++i)
{
int x1 = a + dx[i];
int y1 = b + dy[i];
if(!v[x1][y1] && x1 > 0 && x1 <= n && y1 > 0 && y1 <= m)
{
v[x1][y1] = true;
d[x1][y1] = dis + 1;
point temp(x1, y1);
q.push(temp);
}
}
q.pop();
}
}
int main()
{
scanf("%d%d%d%d", &n, &m, &x, &y);
bfs();
for(int i=1;i<=n;++i)
{
for(int j=1;j<=m;++j)
{
printf("%-5d", d[i][j]);
}
printf("%c", '\n');
}
}