通过重要实例深化搜索思想(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算法,一题多解有助于预防老年痴呆


天下搜索,唯熟不破

剪枝在手,动规拿走

posted @ 2023-08-23 09:48  CultReborn  阅读(8)  评论(0)    收藏  举报