细胞


1329:【例8.2】细胞


时间限制: 1000 ms         内存限制: 65536 KB
提交数: 10796     通过数: 6033

【题目描述】

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

阵列

4 10
0234500067
1034560500
2045600671
0000000089

44个细胞。

【输入】

第一行为矩阵的行nn和列mm;

下面为一个n×mn×m的矩阵。

【输出】

细胞个数。

【输入样例】

4 10
0234500067
1034560500
2045600671
0000000089

【输出样例】

4


【老师提示】

 

n,m 的数据范围:0<=n<=m<=60

 

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int ans,x,y,nx,ny;
 4 char sum[65][65];
 5 int next[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
 6 void dfs(int a,int b){
 7     if(sum[a][b]!='0'){//如果为细胞数字 
 8         sum[a][b]='0';//变为0 
 9         for(int i=0;i<4;i++){
10             nx=a+next[i][0];
11             ny=b+next[i][1];
12             if(nx<0||ny<0||nx>x-1||ny>y-1||sum[nx][ny]=='0')continue;
13             dfs(nx,ny);//最终使此细胞所以数字全部变成0,避免重复记数 
14         }
15     }
16 }
17 int main(){
18     cin>>x>>y;
19     getchar();
20     for(int i=0;i<x;i++)
21     {
22         for(int j=0;j<y;j++)cin>>sum[i][j];
23         getchar();//过滤换行符 
24     }
25     for(int i=0;i<x;i++){
26         for(int j=0;j<y;j++){
27             if(sum[i][j]!='0')//发现细胞
28             {
29                 ans++;//记数 
30                 dfs(i,j);//消灭细胞 
31             }
32         }
33     }
34     cout<<ans;
35     return 0;
36 } 

 

如果觉得不好理解。。。

换成人话就是:

把给定数组看成一个围棋棋盘,0代表没有棋子(空白),其它数字代表有棋子(最多就是颜色不同而已,没有什么区别)

只要是相连(上下左右任选其一)的棋子数字便算一块棋子区域

求棋子区域数量

要注意这道题不能用int数组,要用char或string;

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int ans,x,y,nx,ny;
 4 char sum[65][65];
 5 int next[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
 6 void dfs(int a,int b){
 7     if(sum[a][b]!='0'){//如果为棋子 
 8         sum[a][b]='0';//取出(0代表没有棋子) 
 9         for(int i=0;i<4;i++){
10             nx=a+next[i][0];
11             ny=b+next[i][1];
12             if(nx<0||ny<0||nx>x-1||ny>y-1||sum[nx][ny]=='0')continue;
13             dfs(nx,ny);//最终使此区域数字全部变成0(使此区域没有棋子),避免重复记数 
14         }
15     }
16 }
17 int main(){
18     cin>>x>>y;
19     getchar();
20     for(int i=0;i<x;i++)
21     {
22         for(int j=0;j<y;j++)cin>>sum[i][j];
23         getchar();//过滤换行符 
24     }
25     for(int i=0;i<x;i++){
26         for(int j=0;j<y;j++){
27             if(sum[i][j]!='0')//发现棋子
28             {
29                 ans++;//记录棋子区域数 
30                 dfs(i,j);//取出棋子 
31             }
32         }
33     }
34     cout<<ans;
35     return 0;
36 } 

 

posted @ 2020-10-05 13:26  九州霜  阅读(384)  评论(3编辑  收藏  举报