C++ 算法学习——1.3 广度优先搜索

广度优先搜索:简单讲就是一层一层地搜。


一般采用队列queue来实现,大致模板如下:

BFS(Graph, startNode):
    // 初始化一个队列用于存储待访问节点
    queue = Queue()
    
    // 标记起始节点为已访问,并将其加入队列
    mark startNode as visited
    enqueue startNode into queue
    
    while queue is not empty:
        // 出队并访问队首节点
        currentNode = dequeue from queue
        主干操作;
        
        // 遍历当前节点的所有未访问相邻节点
        for each neighbor of currentNode:
            if neighbor is not visited:
                mark neighbor as visited
                enqueue neighbor into queue

P1. 以洛谷p1443马的遍历为例

#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
int n,m;
int horsex,horsey;

struct spot
{
    int x;
    int y;
    spot(int a,int b):x(a),y(b){}
};


void showcurboard(int** boa,bool** vis)
{
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        if(vis[i][j]==1) cout<<boa[i][j]<<" ";
        else cout<<-1<<" ";
        cout<<endl;
    }
}

bool inthemap(int a,int b)
{
    return a>=1&&a<=n&&b>=1&&b<=m;
}

void renewthemap(int** &boa,int a,int b,bool** &vis)
{
    int x[8]={-2,-2,-1,-1,1,1,2,2};
    int y[8]={1,-1,2,-2,2,-2,1,-1};
    for(int i=0;i<8;i++)
    {
        if(inthemap(a+y[i],b+x[i])&&!vis[a+y[i]][b+x[i]]) boa[a+y[i]][b+x[i]]=boa[a][b]+1;
    }
}

void BFS(int** &boa,bool** &vis)
{
    queue<spot> que;
    spot p=spot(horsex,horsey);
    que.push(p);
    vis[horsex][horsey]=1;
    boa[horsex][horsey]=0;

    while(!que.empty())
    {
        spot q=que.front();
        que.pop();//pop是void函数
        //cout<<endl<<q.x<<" "<<q.y<<endl;
        renewthemap(boa,q.x,q.y,vis);
        int x[8]={-2,-2,-1,-1,1,1,2,2};
        int y[8]={1,-1,2,-2,2,-2,1,-1};
        for(int i=0;i<8;i++)
        {
            if(inthemap(q.x+y[i],q.y+x[i])&&!vis[q.x+y[i]][q.y+x[i]])
            {
                vis[q.x+y[i]][q.y+x[i]]=1;
                spot pp=spot(q.x+y[i],q.y+x[i]);
                que.push(pp);
            }
        }
    }
}

int main()
{
    cin>>n>>m>>horsex>>horsey;
    int** board=new int*[n+2];
    bool** visited=new bool*[n+2];
    for(int i=0;i<=n+1;i++)
    {
        board[i]=new int[m+2];
        visited[i]=new bool[m+2];
        //memset(board[i],0,sizeof(board[i]));对于非字符类型的数组常常错,因为按字节分
        fill(board[i],board[i]+m+2,0);//使用fill,三个参数分别:起点,终点,赋的值
        fill(visited[i],visited[i]+m+2,0);
    }
    BFS(board,visited);
    showcurboard(board,visited);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值