洛谷 - P1443 - 马的遍历 - bfs

本文介绍了一种利用广度优先搜索(BFS)解决骑士周游问题的方法。通过定义一个结构体来存储节点信息,并使用try_enqueue函数简化节点加入队列的操作,实现了高效的遍历过程。文中还对比了不同格式输出对齐方式。

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

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

#include<bits/stdc++.h>
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<QueueNode> 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值