广度优先搜索bfs

  一、含义

这张图非常形象,并且将每个节点访问的先后次序表示出来了,广搜即一层一层的向下寻找,因此适用于寻找最短路径问题。可将这张图看做要从 V1去往V8,没有连线的V之间,无法通过一步转移达到,广搜每一步搜索的时候,只选择可以经过一步状态转移就能达到的相邻节点。

二、写程序要用到的

广搜使用queue队列配合结构体来实现。

几个方法:

先定义一个节点的结构体:

typedef struct{
	int x;//节点的横纵坐标
	int y;
}NODE;

NODE a;

再定义一个以该结构体类型作为元素的队列Q

queue<NODE> Q;

1、Q.pop();//弹出队列中最前面的一个元素,即最早进入的那个元素,让他消失。

2、Q.front();//取出队列中最前面的一个元素的值。

3、Q.empty();//判断队列是否为空。

4、Q.push(a);//将一个相应类型的元素压入队列中。

三、核心代码(模板)

void bfs(int x,int y,int max) {

	node s,p,b;
	s.x=x;
	s.y=y;
	N.push(s);//将起始元素压入队列
	visit[x][y]=true;//访问过了起始元素,标记一下,以免重复访问
	while(!N.empty()) {
		p = N.front();//取出队列最前面的那个元素,以他为新的支点找相邻的可经一步转移达到的状态
		N.pop();
		for(i=0; i<4; i++) {//原题是有上下左右四个方向可走,所以这里即搜索相邻的四个方向
			b.x=p.x+pos[i][0];//对横纵坐标的变换处理
			b.y=p.y+pos[i][1];
			if(valid(b.x,b.y,max)&&!visit[b.x][b.y]) {//判断是否满足入队条件,即未被访问过,未越界
				N.push(b);
				visit[b.x][b.y]=true;//访问过了节点元素,标记一下
			}

		}
	}



}

贴题:洛谷->试炼场->广度优先搜索

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值