细胞数量
题目描述
一矩形阵列由数字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\n",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);
}