首页 > 其他分享 >广度优先搜索(BFS)

广度优先搜索(BFS)

时间:2022-11-09 16:48:13浏览次数:71  
标签:150 优先 sx int 结点 BFS sy flag 广度

基本原理

广度优先搜索在搜索树中又叫按层次遍历。对于搜索树而言,广度优先搜索的思路可以描述为:依次访问根结点的每一个子结点(第二层结点),再通过这些结点访问第三层结点……
其核心思想是:从初始结点开始,应用规则生成第一层结点,检查目标结点,依次拓展,直到发现目标结点为止。
其处理方法是:用数组模拟队列,用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

相关文章

  • BFS广度优先搜索例题分析
    洛谷P1162填涂颜色题目描述由数字\(0\)组成的方阵中,有一任意形状闭合圈,闭合圈由数字\(1\)构成,围圈时只走上下左右\(4\)个方向。现要求把闭合圈内的所有空间都填写......
  • DFS深度优先搜索例题分析
    洛谷P1596LakeCountingS题面翻译由于近期的降雨,雨水汇集在农民约翰的田地不同的地方。我们用一个\(N\timesM(1\timesN\times100,1\leqM\leq100)\)的网格图......
  • day 22- 线程的礼让,优先级,守护线程
    线程的礼让利用Thread.yield()使线程进行礼让礼让的概念:礼让线程,让当前正在执行的线程暂停,但并不是阻塞将线程从运行状态转化为就绪状态线程礼让是由cpu调度,并......
  • 数据结构 最短生成路径(BFS算法、Floyd(弗洛伊德)算法、Dijkstra算法)
    8.9、最短生成路径-BFS算法BFS算法只能处理无权图BFS算法的基本思想代码实现#include<stdio.h>#include<stdlib.h>#include<math.h>#defineMaxSize100#defin......
  • CIO们开始将软件供应链升级为安全优先级top
    开源之所以在软件开发中大量使用的原因是它提供了经过良好测试的构建块,可以加速复杂应用程序和服务的创建。但是第三方软件组件以及包和容器的便利性同时也带来了风险——......
  • C++ 不知图系列之基于邻接矩阵实现广度、深度搜索
    1.前言图是一种抽象数据结构,本质和树结构是一样的。图与树相比较,图具有封闭性,可以把树结构看成是图结构的基础部件。在树结构中,如果把兄弟节点之间或子节点之间横向连接,......
  • Sprint产品待办列表的优先级要怎么排?
    在梳理产品待办事项列表的过程中,产品负责人需要先做优先级排列,保证我们 在一定的时间盒内能够交付需要优先级最高、最具价值的用户故事。那这个用户故事的优先级要怎么排列......
  • leetcode(34)优先队列系列题目
    218.天际线问题用SortedList存边界,每次删除或加入边界判断最高点是否变化classSolution:defgetSkyline(self,buildings:List[List[int]])->List[List[int]]:......
  • C语言运算符优先级
    C语言的运算符包括单目运算符、双目运算符、三目运算符,优先级如下:第1优先级:各种括号,如()、[]等、成员运算符.;第2优先级:所有单目运算符,如++、–、!、~等;第3优先级:乘法运算......
  • 数据结构 图的遍历(广度优先遍历、深度优先遍历)
    8.6、图的广度优先遍历找到与顶点相邻的所有顶点,标记哪些顶点被访问过需要一个辅助队列#include<stdio.h>#include<stdlib.h>#include<math.h>#defineMaxSiz......