题目描述
一矩形阵列由数字 00 到 99 组成,数字 11 到 99 代表细胞,细胞的定义为沿细胞数字上下左右若还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。
输入格式
第一行两个整数代表矩阵大小 �n 和 �m。
接下来 �n 行,每行一个长度为 �m 的只含字符 0
到 9
的字符串,代表这个 �×�n×m 的矩阵。
输出格式
一行一个整数代表细胞个数。
输入输出样例
输入 #1复制
4 10 0234500067 1034560500 2045600671 0000000089
输出 #1复制
4
说明/提示
数据规模与约定
对于 100%100% 的数据,保证 1≤�,�≤1001≤n,m≤100。
想法:
学dfs也有一段时间了,这几天先总结一下之前学的,写的题目。这题也有点像模板题吧。具体看代码。值得注意的是,求连通块没有回溯,就只是一条路走到黑,然后结束。下一篇的迷宫是有回溯的。
代码:
#include<bits/stdc++.h>
using namespace std;
int n,m;
int ans=0;
char xb[110][110];//细胞
int st[110][110];//状态数组
int dx[]={0,0,1,-1};//四联通
int dy[]={1,-1,0,0};
void dfs(int x,int y){
for(int i=0;i<4;i++){
int xx=dx[i]+x;
int yy=dy[i]+y;
if(xx>n||xx<1||yy>m||yy<1) continue;//超范围
if(st[xx][yy]==1) continue;//已经算过的
if(xb[xx][yy]=='0') continue;//不是细胞
st[xx][yy]=1;//标记一下算过的
dfs(xx,yy);//继续搜
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++)
cin>>xb[i][j];
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(st[i][j]==0&&xb[i][j]!='0'){
st[i][j]=1;
ans++;
dfs(i,j);
}
}
}
cout<<ans;
}