关于广搜,就是一个宽度搜索的一个过程。
我们来理解一下它的搜索的过程。
来有一个&代表没有搜索的地方,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;
}