广度优先搜索练习感想

本文作者分享了在学习和应用广度优先搜索(BFS)算法过程中的感悟。从矩阵找块问题到8数码难题,通过实际案例探讨了BFS在解决最少步数问题上的优势。对于8数码难题,作者提到了多种判重策略,如大数组、map和hash,并选择了map+BFS作为解决方案。通过不断实践,作者深化了对状态压缩和数据结构使用理解。
摘要由CSDN通过智能技术生成

广搜的定义在此不再赘述,特别的,它非常适宜于解决“最少”这种发问的问题,一般由队列实现,我在锻炼的过程中也有了一些感悟。
首先广搜的问题是由迷宫问题引出的,这里设置两个增量数组比较简洁,从这里开始我就注意到广搜的分支其实比较容易写,关键在于这些数据如何存储和如何判重,解决了这两个,可能问题就比较清晰,下面是一些实例。

引、矩阵找块

题目: 求01矩阵中,一个位置上下左右是为相邻,若若干个1相邻,它们就构成了一个块,求块的个数
分析:这个题目其实用bfs和dfs均可以,其实和数据学图后找连通分量差不多。遍历矩阵所有点,如果遇到1采用bfs把这一块全部遍历,块数加一,注意遍历后应该标记以判重,这里由于矩阵不大,直接用两个二重数组存储矩阵和状态。

#include<iostream> 
#include<queue> 
using namespace std;
int dx[]={
   0,0,-1,1},dy[]={
   -1,1,0,0};
int a[15][15],count=0,n,m;
bool b[15][15];
struct node{
   
	int x,y;
};
node t,temp;

void bfs(node start){
            //进入这个点为1点 ,广搜法 
	queue<node> q;
	q.push(start);
	while(!q.empty()){
   
	t=q.front();q.pop();
	for(int i=0;i<4;i++) {
   
		if(a[t.x+dx[i]][t.y+dy[i]]&&1<=t.x+dx[i]&&t.x+dx[i]
		<=m&&1<=t.y+dy[i]&&t.y+dy[i]<=n&&!b[t.x+dx
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值