题目描述
一矩形阵列由数字 0 到 9 组成,数字 1 到 9 代表细胞,细胞的定义为沿细胞数字上下左右若还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。
输入格式
第一行两个整数代表矩阵大小 n 和 m。
接下来 n 行,每行一个长度为 m 的只含字符 0
到 9
的字符串,代表这个n×m 的矩阵。
输出格式
一行一个整数代表细胞个数。
输入输出样例
输入 #1复制
4 10 0234500067 1034560500 2045600671 0000000089
输出 #1复制
4
说明/提示
数据规模与约定
对于 100% 的数据,保证 1≤n,m≤100。
思路:经典的dfs,只需要记录x,y。循环遍历每个点,碰到1~9,而且没有走过,ans++,从这个点开始搜索连着的一整块,用一个数组记录,走过的位置和连着一块的位置。
#include <iostream>
#include <math.h>
#include <algorithm>
#include <stack>
#include <string.h>
#include <vector>
#include <cstring>
using namespace std;
int n,m,ans=0;
char a[1000][105];
int vis[1000][105]= {0},dx[4]= {0,0,1,-1},dy[4]= {1,-1,0,0};
void dfs(int x,int y) {
if(x==n&&y==m) {
return;
}
if(x>=0&&y>=0&&x<n&&y<m&&!vis[x][y]&&a[x][y]>'0'&&a[x][y]<='9') {
vis[x][y]=1;
for(int i=0; i<4; i++) {
{
if(x+dx[i]>=0&&y+dy[i]>=0&&x+dx[i]<n&&y+dy[i]<m)
dfs(x+dx[i],y+dy[i]);
}
}
}
}
int main() {
cin>>n>>m;
for(int i=0; i<n; i++)
cin>>a[i];
for(int i=0; i<n; i++) {
for(int j=0; j<m; j++) {
if(!vis[i][j]&&a[i][j]!='0') {
// cout<<i<<" "<<j<<endl;
ans++;
dfs(i,j);
}
}
}
cout<<ans<<endl;
return 0;
}