细胞 如果运气好也是错,那我倒愿意错上加错! ❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀

细胞
如果运气好也是错,那我倒愿意错上加错!
❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀

【题目】

一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。如:
阵列
有4个细胞。

【算法分析】

       ⑴从文件中读入m*n矩阵阵列,将其转换为bool矩阵存入b数组中;
       ⑵沿b数组矩阵从上到下,从左到右,找到遇到的第一个细胞;
       ⑶将细胞的位置入队h,并沿其上、下、左、右四个方向上的细胞位置入队,入队后的位置b数组置为flase;
       ⑷将h队的队头出队,沿其上、下、左、右四个方向上的细胞位置入队,入队后的位置b数组置为flase;
       ⑸重复4,直至h队空为止,则此时找出了一个细胞;
       ⑹重复2,直至矩阵找不到细胞;
       ⑺输出找到的细胞数。

【代码】

 1 #include<cstdio>
 2 
 3 using namespace std;
 4 
 5 int m,n,g=0,c[5]= {1,0,-1,0,1};
 6 char jz[999][999];
 7 bool bao[999][999];
 8 
 9 void xb(int,int);
10 
11 int main() {
12     scanf("%d %d
",&n,&m);
13     for(int i=0; i<n; i++)
14         gets(jz[i]);
15     for(int i=0; i<n; i++) {
16         for(int j=0; j<m; j++) {
17             bao[i][j]=jz[i][j]-'0';
18         }
19     }
20     for(int i=0; i<n; i++) {
21         for(int j=0; j<m; j++) {
22             if(bao[i][j]) {
23                 bao[i][j]=0;
24                 xb(i,j);
25                 g++;
26             }
27         }
28     }
29     printf("%d",g);
30     return 0;
31 }
32 
33 void xb(int x,int y) {
34     for(int i=0; i<4; i++) {
35         if(x+c[i]>-1&&x+c[i]<n&&y+c[i+1]>-1&&y+c[i+1]<m&&bao[x+c[i]][y+c[i+1]]) { //沿细胞的上下左右四个方向搜索细胞
36             //i==0时,横坐标+1,即为向下搜索;i==1时,纵坐标-1,即为向左搜索;i==2时,横坐标-1,即为向上搜索;i==3时,纵坐标+1,即为向右搜索;
37             bao[x+c[i]][y+c[i+1]]=0;
38             xb(x+c[i],y+c[i+1]);
39         }
40     }
41 }