略有收获的bfs,使用了try_enqueue函数使得加入队列非常方便。性能理论上是一样的因为是inline?
还有就是左对齐是使用%-4d,相对于右对齐的%4d,还有右对齐前导零的%04d,自己试一下呗。
#includeusing namespace std; #define ll long long int n,m,sx,sy; int ans[405][405]; struct QueueNode{ int x,y,t; QueueNode(int x=0,int y=0,int t=0):x(x),y(y),t(t){} }; queue q; inline void try_enqueue(int x,int y,int t){ if(x>=1&&x<=n&&y>=1&&y<=m&&ans[x][y]==-1){ ans[x][y]=t+1; q.push(QueueNode(x,y,t+1)); } } void bfs(){ try_enqueue(sx,sy,-1); while(!q.empty()){ QueueNode cur=q.front(); q.pop(); int x=cur.x; int y=cur.y; int t=cur.t; try_enqueue(x-1,y-2,t); try_enqueue(x-2,y-1,t); try_enqueue(x-2,y+1,t); try_enqueue(x-1,y+2,t); try_enqueue(x+1,y+2,t); try_enqueue(x+2,y+1,t); try_enqueue(x+2,y-1,t); try_enqueue(x+1,y-2,t); } } int main(){ scanf("%d%d%d%d",&n,&m,&sx,&sy); memset(ans,-1,sizeof(ans)); bfs(); for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ printf("%-4d%c",ans[i][j]," \n"[j==m]); } } }