```cpp
#include<bits/stdc++.h>
using namespace std;
struct xnn{
int x,y;
};
queue<xnn> Q;
int n,m,kx,ky,a[400+5][400+5];
int sx[8]={2,1,-1,-2,-2,-1,1,2};
int sy[8]={1,2,2,1,-1,-2,-2,-1};
int main()
{
scanf("%d%d",&n,&m);
scanf("%d%d",&kx,&ky);
memset(a,-1,sizeof(a));
xnn tmp = {kx,ky};
Q.push(tmp);
a[kx][ky] = 0;
while (!Q.empty()){
xnn u=Q.front();
int ux=u.x,uy=u.y;
Q.pop();
for(int l=0;l<8;l++){
int x=ux+sx[l],y=uy+sy[l];
int d=a[ux][uy];
if(x < 1 || x > n || y < 1 || y > m || a[x][y]!=-1) continue;
a[x][y]=d+1;
xnn tmp={x,y};
Q.push(tmp);
}
}
for(int i=1;i<=n;i++,puts(" ")){
for(int j=1;j<=m;j++){
printf("%-5d",a[i][j]);
}
}
return 0;
}
```
by mouyulin @ 2024-02-01 09:30:16
不能这么做,要一次把每个点的最短距离求出来,不然会TLE
by J_Kobe @ 2024-02-01 09:34:32
```cpp
#include <bits/stdc++.h>
using namespace std;
int n, m, x, y;
bool f[405][405];
int ans[405][405];
int dx[10] = {-1,1,1,-1,-2,-2,2,2};
int dy[10] = {2,2,-2,-2,-1,1,1,-1};
struct node
{
int x, y, v;
};
void bfs()
{
memset(f, 0, sizeof(f));
queue<node> q;
q.push((node){x, y, 0});
f[x][y] = 1;
while (q.empty() == 0)
{
node k = q.front();
q.pop();
for (int i = 0; i < 8; i++)
{
int newx = k.x, newy = k.y;
newx += dx[i];
newy += dy[i];
if (newx <= 0 || newx > n || newy <= 0 || newy > m)
{
continue;
}
if (f[newx][newy] == 0)
{
f[newx][newy] = 1;
ans[newx][newy] = k.v + 1;
q.push((node){newx, newy, k.v+1});
}
}
}
}
signed main()
{
scanf("%d%d%d%d", &n, &m, &x, &y);
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
ans[i][j] = -1;
}
}
ans[x][y] = 0;
bfs();
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
printf("%d ", ans[i][j]);
}
printf("\n");
}
return 0;
}
```
这是我的代码,可以参考一些。
by J_Kobe @ 2024-02-01 09:37:04
@[liwenxi110720](/user/661913) 你可以参考一下
by J_Kobe @ 2024-02-01 09:41:36
@[J_Kobe](/user/844496)
谢谢你奥
by liwenxi114514 @ 2024-02-01 09:43:25