zoukankan      html  css  js  c++  java
  • 细胞


    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 } 
  • 相关阅读:
    BZOJ-3495 前缀优化建图2-SAT
    洛谷P3979 遥远的国度 树链剖分+分类讨论
    hdu
    hdu
    poj
    poj-1330(暴力写的lca)
    树链剖分
    Dijkstra
    Floyed
    最短路径
  • 原文地址:https://www.cnblogs.com/TFLSc1908lzs/p/13769794.html
Copyright © 2011-2022 走看看