细胞数量

题目描述

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

输入输出格式

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

矩阵

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

输入输出样例

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

这是一道很水的题,结果耗了我将近一个下午,后来才知道写代码不能开360安全卫士,否则会造成奇奇怪怪的错误qwq。。。。。深搜or宽搜都能过

广搜:

#include<bits/stdc++.h>
int n,m,b[105][105],a[105][3],sum;
int x[4]={-1,0,1,0},y[4]={0,1,0,-1};
void bfs(int i,int j){
    int head=1,foot=2;
    b[i][j]=0;a[2][1]=i;a[2][2]=j;
    sum++;
    while(head<foot){
        head++;
        for(int q=0;q<=3;q++){
            int xx=a[head][1]+x[q];
            int yy=a[head][2]+y[q];
            if(b[xx][yy] && xx>0 && xx<=n && yy>0 && yy<=m){
                foot++;
                a[foot][1]=xx;
                a[foot][2]=yy;
                b[xx][yy]=0;
            }
        }
    }
}
int main(){
    scanf("%d%d",&n,&m); 
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++){
            char c;
            scanf(" %c",&c);
            if(c!='0')  b[i][j]=1;
        }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++){
            if(b[i][j]) bfs(i,j);
        }
    printf("%d
",sum);
} 

深搜:

#include<bits/stdc++.h>
int m,n,cnt;
bool b[105][105],a[105][105];       //数组a表示细胞是否还在,如果搜过就标记为不在 
int x[4]={0,0,1,-1},y[4]={-1,1,0,0};    //数组b表示搜没搜过,回溯 
void dfs(int ii,int jj){
    for(int k=0;k<=3;k++){
        int i=ii+x[k];
        int j=jj+y[k];
        if(i<=m && i>=1 && j<=n && j>=1 && b[i][j]){
            b[i][j]=0;
            a[i][j]=0;
            dfs(i,j);
            b[i][j]=0;
        }
    }
}
int main(){
    scanf("%d%d",&m,&n);
    for(int i=1;i<=m;i++)
        for(int j=1;j<=n;j++){
            char c;
            scanf(" %c",&c);
            if(c!='0'){
                b[i][j]=1;
                a[i][j]=1;
            }
        }
    for(int i=1;i<=m;i++)
        for(int j=1;j<=n;j++){
            if(a[i][j]==1){dfs(i,j);cnt++;}
        }
    printf("%d",cnt);
}
原文地址:https://www.cnblogs.com/sdfzsyq/p/9677262.html