广度优先搜索

广度优先搜索

当碰到岔路口,总是先依次访问从岔路口能直接到达的所有的结点,然后再按这些结点被访问的顺序去依次访问它们能直接到达的所有结点,直到所有的结点都被访问。

实现原理

广度优先搜索一般有队列实现,且总是按照层次的顺序进行遍历,基本写法:

void bfs(int s)
{
    queue q;
    q.push(s);
    while(!q.empty()){
      取出队首元素top;
      访问队首元素top;
      将队首元素出队;
      将top的下一层结点中未曾入队的结点全部入队,并设置为已入队;
  }
}

1.定义队列q,并将起点s入队。
2.while循环,条件是队列q非空。
3.在while循环中,先取出队首元素top,然后访问它,访问完将其出队。
4.将top的下一层结点中所有未曾入队的结点入队,并标记它们的层号为now的层号加1,同时设置这些入队的结点已入过队。
5.返回循环继续

例子

给出一个mxn的矩阵,矩阵中的元素为0或1。求给定的矩阵中块(1在一起)的个数。

#include
#include
#include
using namespace std;
int a[100][100];
bool inq[100][100]={false};
int n,m;
int X[]={0,0,-1,1};
int Y[]={1,-1,0,0};
struct node{
    int x;
    int y;
}Node;
bool judge(int x,int y)
{
    if(x>=n||y>=m||x<0||y<0){
        return false;
    }
    if(a[x][y]==0||inq[x][y]==true){
        return false;
    }
    return true;
}
void bfs(int x,int y)
{
    queue Q;
    Node.x=x;
    Node.y=y;
    Q.push(Node);
    inq[x][y]=true;
    while(!Q.empty()){
        node top=Q.front();
        Q.pop();
        for(int i=0;i<4;++i){
            int newx=top.x+X[i];
            int newy=top.y+Y[i];
            if(judge(newx,newy)){
                   Node.x=newx;
                   Node.y=newy;
                   Q.push(Node);
                   inq[newx][newy]=true;
               }
            }
        }
}

int main()
{
    int ans=0;
    scanf("%d%d",&n,&m);
    for(int x=0;x

你可能感兴趣的:(广度优先搜索)