关于广搜,就是一个宽度搜索的一个过程。

我们来理解一下它的搜索的过程。

来有一个&代表没有搜索的地方,0代表搜索过的地方。

比如:

&&&&&

&&&&&

&&&0&

&&&&&

第一步:

&&&&&

&&&0&

&&000

&&&0&

第二步:

&&&0&

&&000

&0000

&&000

你可以看得出来,这个过程,就是如同病毒扩散一样,每一个搜索到的新的点,都可以作为新搜索点,搜索点可以有四个方向。

直到搜索结束。

理解了过程,我们来处理学习BFS的搜索代码:

 

经典广搜题

 

看了这个博客:

就可以大概理解清楚搜索题目,以及里面代码的解释;

 

然后下面我们给出一个模板:

第一个是通常的一个做法:

第二个是一个多点同时进行的搜索过程;

 

#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<queue>
#include<iostream>
using namespace std;
int dis[4][2]= {1,0,-1,0,0,1,0,-1};
struct point
{
    int x,y,tenp;
};
int bfs(point s,point e,int map[9][9])//
{
    queue<point>q;//栈
    int i;
    point t;
    s.tenp=0;//初始步数
    map[s.x][s.y]=1;//图开始的搜索;
    q.push(s);
    while(!q.empty())//栈的模板
    {
        s=q.front();
        q.pop();
        if(s.x==e.x&&s.y==e.y)//判为不能通过或者达到目标;
            return s.tenp;//返回步数
        for(i=0; i<4; i++)//遍历四个方向
        {
            t.x=s.x+dis[i][0];
            t.y=s.y+dis[i][1];
            if(map[t.x][t.y]==0)
            {
                t.tenp=s.tenp+1;
                map[t.x][t.y]=1;
                q.push(t);
            }
        }
    }
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        point s,e;
        int map[9][9]= {1,1,1,1,1,1,1,1,1,
                        1,0,0,1,0,0,1,0,1,
                        1,0,0,1,1,0,0,0,1,
                        1,0,1,0,1,1,0,1,1,
                        1,0,0,0,0,1,0,0,1,
                        1,1,0,1,0,1,0,0,1,
                        1,1,0,1,0,1,0,0,1,
                        1,1,0,1,0,0,0,0,1,
                        1,1,1,1,1,1,1,1,1,
                       };
        scanf("%d%d%d%d",&s.x,&s.y,&e.x,&e.y);
        printf("%d\n",bfs(s,e,map));
    }
    return 0;
}
#include<cstdio>
#include<iostream>
#include<iomanip>
#include<string.h>
#include<algorithm>
#include<queue>
#define pi acos(-1.0)
#define MaxN  0x3f3f3f3f
#define MinN  0xc0c0c0c0
using namespace std;
typedef long long ll;
const int N=1e3+10;
char s[N][N];
int n,m;
int ans[N][N];
int dis[4][2]= {1,0,0,1,-1,0,0,-1}; //方向
struct node
{
    int x,y,step;
}st,en;
queue<node>q;
int judge()//判断条件
{
    if(en.x<0||en.x>=n||en.y<0||en.y>=m||ans[en.x][en.y]!=-1)
    {
        return 1;
    }
    return 0;
}
void bfs()
{
    while(!q.empty())
    {
        st=q.front();
        q.pop();
        for(int i=0;i<4;i++)
        {
            en.x=st.x+dis[i][0];
            en.y=st.y+dis[i][1];
            if(judge())
                continue;
            en.step=st.step+1;
            ans[en.x][en.y]=en.step;
            q.push(en);
        }
    }
}
int main()
{
    scanf("%d %d",&n,&m);
    for(int i=0;i<n;i++)
    {
        scanf("%s",s[i]);
    }
    memset(ans,-1,sizeof(ans));
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            if(s[i][j]=='0')//先找出所有位‘0’的坐标,优化
            {
                st.x=i;
                st.y=j;
                st.step=0;
                ans[i][j]=0;//一开始就处理了0的点
                q.push(st);//进队列
            }
        }
    }
    bfs();
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            printf("%d ",ans[i][j]);
        }
        printf("\n");
    }
    return 0;
}