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