1329:【例8.2】细胞

细胞

做的第一道广搜题,纪念一下!!!

 

题解:

main函数中的循环每次进入bfs()函数,会将“隶属于一个细胞”的所有细胞进行搜索并标记。

由于下一个细胞群的位置无法确定,所以只能老老实实遍历了,但由于有标记,不会重复多余的进入bfs()函数。

相当于main函数中的循环进入几次bfs()函数,就产生几个队列,也就是答案。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<queue>
 4 using namespace std;
 5 
 6 const int N=1005;
 7 int r,c,ans,a[N][N],t[]={-1,1,0,0,0,0,-1,1};
 8 queue<int> q;
 9 void bfs(){
10     if(q.empty()){
11         ans++;
12         return;
13     }
14     int ni=q.front();
15     q.pop();
16     int nj=q.front();
17     q.pop();
18     a[ni][nj]=0;
19     for(int i=0;i<4;i++){
20         ni+=t[i],nj+=t[i+4];
21         if(ni>0&&ni<=r&&nj>0&&nj<=c&&a[ni][nj])
22             q.push(ni),q.push(nj);
23         ni-=t[i],nj-=t[i+4];
24     }
25     bfs();
26 }
27 int main(){
28     cin>>r>>c;
29     char cc;
30     for(int i=1;i<=r;i++)
31         for(int j=1;j<=c;j++){
32             cin>>cc;
33             a[i][j]=cc-'0';
34         }      
35     for(int i=1;i<=r;i++)
36         for(int j=1;j<=c;j++)
37             if(a[i][j]){
38                 q.push(i),q.push(j);
39                 bfs();
40             }
41     cout<<ans;
42     return 0;
43 }

 

posted @ 2021-08-13 10:55  Rekord  阅读(351)  评论(0编辑  收藏  举报