通过重要实例深化搜索思想(BFS篇)
0.BFS题单
还是二话不说直接上代码
1.P1443 马的遍历
#include<bits/stdc++.h>
using namespace std;
struct node{
int x,y;
};
queue <node> q;
int dx[8]={2,2,1,1,-2,-2,-1,-1};
int dy[8]={-1,1,2,-2,-1,1,2,-2};
int dep[401][401];
bool vis[401][401];
int m,n,x,y;
void Push(int a,int b){
node t; t.x=a; t.y=b;
q.push(t);
}
int main(){
cin>>m>>n>>x>>y;
memset(dep,-1,sizeof(dep));
memset(vis,0,sizeof(vis));
dep[x][y]=0; vis[x][y]=1; Push(x,y);
while(!q.empty()){
node t;
t=q.front();
int nx=t.x;
int ny=t.y;
q.pop();
for(int i=0;i<=7;i++){
int nnx=nx+dx[i], nny=ny+dy[i];
if(nnx<=m&&nny<=n&&nnx>=1&&nny>=1&&!vis[nnx][nny]&&dep[nnx][nny]==-1){
Push(nnx,nny);
vis[nnx][nny]=true;
dep[nnx][nny]=dep[nx][ny]+1;
}
}
}
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
printf("%-5d",dep[i][j]);
}
printf("\n");
}
return 0;
}
2.T235810 瓷砖
#include<bits/stdc++.h>
using namespace std;
struct{
int x,y;
}q[2510];
int used[55][55];
char a[55][55];
int w,h,front,rear,sx,sy;
int dx[4]={0,0,1,-1};
int dy[4]={-1,1,0,0};
int main(){
cin>>w>>h;
for(int i=1;i<=h;i++)
for(int j=1;j<=w;j++){
cin>>a[i][j];
if(a[i][j]=='@'){
sx=i;
sy=j;
}
}
front=1;
rear=1;
q[1].x=sx;
q[1].y=sy;
used[sx][sy]=1;
while(front<=rear){
int nowx=q[front].x;
int nowy=q[front].y;
for(int i=0;i<4;i++){
int nx=nowx+dx[i];
int ny=nowy+dy[i];
if(a[nx][ny]=='.' && !used[nx][ny]){
rear++;
q[rear].x=nx;
q[rear].y=ny;
used[nx][ny]=1;
}
}
front++;
}
cout<<rear<<endl;
return 0;
}
3.P1588 Catch That Cow S
#include<bits/stdc++.h>
using namespace std;
int n,m,x,q[100001],vis[100001],dep[100001];
int main(){
int c;
cin>>c;
while(c--) {
cin>>n>>m;
memset(q,0,sizeof(q));
memset(vis,0,sizeof(vis));
memset(dep,0,sizeof(dep));
int head=0,tail=1;
q[tail]=n;
vis[n]=1;
while(head<=tail){
head++;
for(int i=0;i<3;i++){
x=q[head];
if(i==0) x++;
if(i==1) x--;
if(i==2) x*=2;
if(x>=0 && x<=100000)
if(!vis[x]){
tail++;
q[tail]=x;
vis[x]=1;
dep[x]=dep[q[head]]+1;
}
}
}
cout<<dep[m]<<endl;
}
return 0;
}
4.T235789 最大黑区域(STL_Queue写法)
#include<iostream>
using namespace std;
const int N=110;
int a[N][N],h[N][N];
struct pos{
int x,y;
};
pos q[N*N+1];
int n,m,front,rear,ans,nx,ny;
int dx[4]={0,0,1,-1};
int dy[4]={-1,1,0,0};
int main(){
cin>>n>>m;
for(int i=2;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>a[i][j];
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(a[i][j]){
front=1;
rear=1;
q[rear].x=i;
q[rear].y=j;
h[i][j]=1;
while(front<=rear){
for(int k=0;k<4;k++){
nx=q[front].y+dx[k];
ny=q[front].y+dy[k];
if(a[nx][ny] && !h[nx][ny]){
rear++;
q[rear].x=nx;
q[rear].y=ny;
h[nx][ny]=1;
}
}
front++;
}
ans=max(ans,rear);
}
cout<<ans<<endl;
}
非常建议用queue写BFS,简单不容易出错
“最大黑区域”此题不能错过DFS算法,一题多解有助于预防老年痴呆

浙公网安备 33010602011771号