BFS90分,TLE#8

P1443 马的遍历

```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


|