[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

原文地址:https://www.cnblogs.com/ghostcai/p/9247551.html