• [LUOGU]P1451 求细胞数量


    题目描述

    一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右若还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。(1<=m,n<=100)?

    输入输出格式

    输入格式: 输入:整数m,n(m行,n列)

    矩阵

    输出格式: 输出:细胞的个数

    输入输出样例

    输入样例#1:4 10
    0234500067
    1034560500
    2045600671
    0000000089
    输出样例#1: 4

    dfs每个非0且未访问的数字。

    
    
    #include<iostream>
    #include<string>
    #define MAXN 200
    using namespace std;
    
    int a[MAXN][MAXN];
    int m,n;
    bool vis[MAXN][MAXN];
    int ans;
    
    inline bool pd(int x,int y) {
        if(x<=m&&x>0&&y<=n&&y>0) return true;
        return false;
    }
    
    void dfs(int x,int y) {
        if(vis[x][y]||a[x][y]==0) return;
    
        a[x][y]=-1;
        vis[x][y]=1;
        if(pd(x+1,y)) dfs(x+1,y);
        if(pd(x-1,y)) dfs(x-1,y);
        if(pd(x,y+1)) dfs(x,y+1);
        if(pd(x,y-1)) dfs(x,y-1);
    
    
        return;
    }
    
    int calc() {
        int i,j;
        int cnt=0;
        for(i=1; i<=m; i++) {
            for(j=1; j<=n; j++) {
                if(a[i][j]==-1) {
                    a[i][j]=0;
                    cnt++;
                }
            }
        }
        return cnt;
    }
    
    void show(){
        for(int i=1; i<=m; i++) {
            for(int j=1; j<=n; j++) {
                cout<<a[i][j]<<" ";
            }
            cout<<endl;
        }
        cout<<endl;
    }
    
    int main() {
        int i,j;
        cin>>m>>n;
        string s;
        for(i=1; i<=m; i++) {
            cin>>s;
            for(j=0; j<n ; j++) {
                a[i][j+1]=s[j]-'0';
            }
        }
        for(i=1; i<=m; i++) {
            for(j=1; j<=n; j++) {
                if(!vis[i][j]&&a[i][j]!=0) {
                    dfs(i,j);
    //              show();
                    int re=calc();
                    if(re>0) ans++;
    
                }
            }
        }
    
        cout<<ans;
        return 0;
    }

    和swim很像。。恩

    宽搜版:

    #include<iostream>
    #include<queue>
    #include<string>
    #define MAXN 200
    using namespace std;
    
    int n,m;
    int a[MAXN][MAXN];
    int cnt;
    bool vis[MAXN][MAXN];
    int mx[4]= {1,0,-1,0};
    int my[4]= {0,1,0,-1};
    
    struct point {
        int x,y;
    } node,r;
    
    void bfs(int x,int y) {
        a[x][y]=0;
        vis[x][y]=1;
        queue<point> Q;
        node.x = x;
        node.y = y;
        Q.push(node);
        while(!Q.empty() ) {
            r=Q.front() ;
            Q.pop();
            for(int i=0; i<=3; i++) {
                int nx=r.x + mx[i],ny=r.y + my[i];
                if(nx>0&&nx<=m&&ny>0&&ny<=n&&a[nx][ny]!=0&&!vis[nx][ny]) {
                    a[nx][ny]=0;
                    vis[nx][ny]=1;
                    node.x = nx;
                    node.y = ny;
                    Q.push(node); 
                }
            }
        }
    }
    
    void show(){
        for(int i=1; i<=m; i++) {
            for(int j=1; j<=n; j++) {
                cout<<a[i][j]<<" ";
            }
            cout<<endl;
        }
        cout<<endl;
    }
    int main() {
        string s;
        cin>>m>>n;
        int i,j;
        for(i=1; i<=m; i++) {
            cin>>s;
            for(j=0; j<n; j++) {
                a[i][j+1]=s[j]-'0';
            }
        }
    
        for(i=1; i<=m; i++) {
            for(j=1; j<=n; j++) {
                if(a[i][j]!=0) {
                    bfs(i,j);
                    cnt++;
                }
            }
        }
        cout<<cnt;
    
    }

    本文来自博客园,作者:GhostCai,转载请注明原文链接:https://www.cnblogs.com/ghostcai/p/9247551.html

  • 相关阅读:
    Web网页配色方案及安全色谱
    JQuery获取元素文档大小、偏移和位置和滚动条位置的方法集合
    IE8的css hack
    jquery 获取元素坐标
    CSS 颜色值
    正则表达式
    JS获取宽度
    常用正则表达式例子
    HTML转义字符
    myeclipse 10.0 含破解补丁/注册机
  • 原文地址:https://www.cnblogs.com/ghostcai/p/9247551.html
Copyright © 2020-2023  润新知