队列例题-连通块

Posted wanjinliu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了队列例题-连通块相关的知识,希望对你有一定的参考价值。

代码如下:

  1 #include <iostream>
  2 using namespace std;
  3 struct Node
  4 
  5     int x,y;
  6 ;
  7 int a[100][100],h,w;
  8 //队列
  9 struct Queue
 10 
 11     Node a[100];
 12     int front;
 13     int rear;
 14  q;
 15 int n=50;//存实际占用空间为n+1,即0-n。
 16 //队满
 17 bool isfull()
 18 
 19     return (q.rear+1)%(n+1)==q.front;
 20 
 21 //队空
 22 bool isempty()
 23 
 24     return q.rear==q.front;
 25 
 26 //入队
 27 void inq(Node x)
 28 
 29     if(!isfull())
 30     
 31         q.a[q.rear]=x;
 32         q.rear= (q.rear+1)%(n+1);
 33     
 34     else
 35     
 36         cout<<"The queue is full.";
 37     
 38 
 39 //出队
 40 Node outq()
 41 
 42     Node t;
 43     t=q.a[q.front];
 44     q.front=(q.front+1)%(n+1);
 45     return t;
 46 
 47 
 48 void mark(Node t_n)
 49 
 50     Node t;
 51     a[t_n.x][t_n.y]=2;
 52     if(t_n.x-1>=0)
 53     
 54         t.x=t_n.x-1;
 55         t.y=t_n.y;
 56         if(a[t.x][t.y]==1)
 57         
 58             inq(t);
 59         
 60     
 61     if(t_n.y-1>=0)
 62     
 63         t.x=t_n.x;
 64         t.y=t_n.y-1;
 65         if(a[t.x][t.y]==1)
 66         
 67             inq(t);
 68         
 69     
 70     if(t_n.x+1<w)
 71     
 72         t.x=t_n.x+1;
 73         t.y=t_n.y;
 74         if(a[t.x][t.y]==1)
 75         
 76             inq(t);
 77         
 78     
 79     if(t_n.y+1<h)
 80     
 81         t.x=t_n.x;
 82         t.y=t_n.y+1;
 83         if(a[t.x][t.y]==1)
 84         
 85             inq(t);
 86         
 87     
 88     while(!isempty())
 89     
 90         mark(outq());
 91     
 92 
 93 main()
 94 
 95     q.front=0;
 96     q.rear=0;
 97     int c=0;
 98     cin>>h>>w;
 99     for(int i=0; i<h; i++)
100     
101         for(int j=0; j<w; j++)
102         
103             cin>>a[i][j];
104         
105     
106     for(int i=0; i<h; i++)
107     
108         for(int j=0; j<w; j++)
109         
110             if(a[i][j]==1)
111             
112                 Node t;
113                 t.x=i;
114                 t.y=j;
115                 mark(t);
116                 c++;
117             
118         
119     
120     cout<<c;
121 

运行效果1:

技术图片

运行效果2:

技术图片

以上是关于队列例题-连通块的主要内容,如果未能解决你的问题,请参考以下文章

油田(Oil Deposits)-用DFS求连通块

UVa572 Oil Deposits (DFS求连通块)

基础深搜小结

ybtoj强连通分块Tarjan例题2受欢迎的牛

强连通分量tarjan算法及kosaraju算法+例题

ybtoj强连通分块TarjanDP例题1有向图缩点