题目描述
一矩形阵列由数字 00 到 99 组成,数字 11 到 99 代表细胞,细胞的定义为沿细胞数字上下左右若还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。
输入格式
第一行两个整数代表矩阵大小 n 和 m。
接下来 n 行,每行一个长度为 m 的只含字符 0
到 9
的字符串,代表这个 n×m 的矩阵。
输出格式
一行一个整数代表细胞个数。
输入输出样例
输入
4 10 0234500067 1034560500 2045600671 0000000089
输出
4
说明/提示
数据规模与约定
对于 100%的数据,保证 1≤n,m≤100。
题目分析:
一个比较简单的深度优先搜索题目,读入数据之后在二维数组中的每一个地方都搜索一下。
同时设置一个用来记录是否访问过这个节点的二维数组,避免后续重复访问,还能达到降低时间复杂度的效果。
感觉关键点就在于通过深搜打上标记,然后cnt++,避免重复访问
同时这个题目的数据也比较水。
代码:
#include <iostream>
using namespace std;
const int dx[4] = {-1, 0, 1, 0};
const int dy[4] = {0, 1, 0, -1};
int arr[105][105]={0};
int vis[105][105]={0};
int n, m;
void dfs(int x, int y)
{
if (x < 1 || x > n || y < 1 || y > m || arr[x][y] == 0||vis[x][y] == 1)
return;
vis[x][y] = 1; // 标记为已访问
for (int i = 0; i < 4; i++)
dfs(x + dx[i], y + dy[i]);
}
int main()
{
cin >> n >> m;//读取的时候是字符串!!!!哥!认真读题好不好!
for (int i = 1; i <= n; i++)
{
string tmp;
int tm=0;
cin>>tmp;
for (int j = 1; j <= m; j++)
{
arr[i][j]=tmp[tm++]-'0';
}
}
int cnt = 0;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
if (arr[i][j] != 0 && vis[i][j] == 0)//是细胞同时没访问过
{
dfs(i, j);
cnt++;
}
}
}
cout << cnt;
return 0;
}