细胞
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
【老师提示】
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 }