基本原理
广度优先搜索在搜索树中又叫按层次遍历。对于搜索树而言,广度优先搜索的思路可以描述为:依次访问根结点的每一个子结点(第二层结点),再通过这些结点访问第三层结点……
其核心思想是:从初始结点开始,应用规则生成第一层结点,检查目标结点,依次拓展,直到发现目标结点为止。
其处理方法是:用数组模拟队列,用head,tail两指针模拟出队入队。
BFS算法描述
初始化,初始状态存入OPEN表;
队列首指针head=1;尾指针tail=1;
while(head<=tail){
for(1~max){//max为产生子结点的规则数
if(子结点符合条件){
if(新结点符合条件) 输出并退出
else if(新结点与原已产生结点不重复){
tail指针加1,将新结点存入队尾
}
}
}
head指针后移一位,指向待扩展结点;
}
典型例题
Lake Counting
#include<bits/stdc++.h>
using namespace std;
int n,m,dx[9]={0,0,1,1,1,0,-1,-1,-1},dy[9]={0,-1,-1,0,1,1,1,0,-1},ans=0;
char s[200][200];
void dfs(int p, int q){
for(int i=1;i<=8;i++){
if(s[p+dx[i]][q+dy[i]]=='W'){
s[p+dx[i]][q+dy[i]]='.';
dfs(p+dx[i],q+dy[i]);
}
}
}
int main(){
memset(s,'.',sizeof(s));
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++){
getchar();
for(int j=1;j<=m;j++){
scanf("%c",&s[i][j]);
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(s[i][j]=='W'){
ans++;
s[i][j]='.';
dfs(i,j);
}
}
}
// for(int i=1;i<=n;i++){
// for(int j=1;j<=m;j++){
// cout<<s[i][j];
// }
// cout<<endl;
// }
printf("%d",ans);
return 0;
}
//&&p+dx[i]>0&&p+dx[i]<m+1&&q+dy[i]>0&&q+dy[i]<n+1
抓住那头牛
#include<bits/stdc++.h>
using namespace std;
int n,k,a[100100],dx[4]={0,1,-1},v[100100];
bool flag[100100];
int main(){
scanf("%d %d",&n,&k);
int left=1,right=1;
a[left]=n;
flag[n]=1;
v[n]=1;
while(left<=right){
int x=a[left++];
if(x==k){
// for(int i=1;i<=right;i++) cout<<a[i]<<' ';
// cout<<endl;
// for()
cout<<v[x]-1;
return 0;
}
dx[3]=x;
for(int i=1;i<=3;i++){
int nx=x+dx[i];
if(nx>=0&&nx<=100000&&!flag[nx]){
a[++right]=nx;
v[nx]=v[x]+1;
flag[nx]=1;
}
}
}
return 0;
}
走出迷宫
#include<bits/stdc++.h>
using namespace std;
int n,m,sx,sy,dx[5]={0,-1,0,1,0},dy[5]={0,0,1,0,-1},a[1000000],b[1000000],v[150][150];
char s[150][150];
bool flag[150][150];
int main(){
memset(flag,1,sizeof(flag));
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<m;j++) flag[i][j]=0;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>s[i][j];
if(s[i][j]=='S'){
sx=i;
sy=j;
}
if(s[i][j]=='#') flag[i][j]=1;
if(s[i][j]=='.'||s[i][j]=='T') flag[i][j]=0;
}
}
flag[sx][sy]=1;
a[1]=sx;
v[sx][sy]=1;
b[1]=sy;
int l=1,r=1;
while(l<=r){
int x=a[l],y=b[l];
// cout<<x<<' '<<y<<endl;
l++;
if(s[x][y]=='T'){
cout<<v[x][y]-1;
return 0;
}
for(int i=1;i<=4;i++){
int nx=x+dx[i];
int ny=y+dy[i];
if(!flag[nx][ny]){
flag[nx][ny]=1;
v[nx][ny]=v[x][y]+1;
a[++r]=nx;
b[r]=ny;
}
}
}
return 0;
}
标签:150,优先,sx,int,结点,BFS,sy,flag,广度
From: https://www.cnblogs.com/Nebulary/p/16874265.html