洛谷 - P1443 - 马的遍历 - bfs

略有收获的bfs,使用了try_enqueue函数使得加入队列非常方便。性能理论上是一样的因为是inline?

还有就是左对齐是使用%-4d,相对于右对齐的%4d,还有右对齐前导零的%04d,自己试一下呗。

#include
using 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]);
        }
    }
}

 

转载于:https://www.cnblogs.com/Yinku/p/10658682.html

你可能感兴趣的:(洛谷 - P1443 - 马的遍历 - bfs)