题目描述
一矩形阵列由数字 0 到 9 组成,数字 1 到 9 代表细胞,
细胞的定义为沿细胞数字上下左右若还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。
输入格式
第一行两个整数代表矩阵大小 n 和 m。
接下来 n 行,每行一个长度为 m 的只含字符 0 到 9 的字符串,代表这个 n×m 的矩阵。
输出格式
一行一个整数代表细胞个数。
输入样例
4 10
0234500067
1034560500
2045600671
0000000089
输出样例
4
数据范围
对于 100% 的数据,保证 1 ≤ n, m ≤ 100。
题解一
DFS:
#include <iostream>
#include <cstdio>
using namespace std;
const int N = 110;
int n, m;
int g[N][N];
bool st[N][N];
int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, 1, 0, -1};
void dfs(int x, int y)
{
st[x][y] = true;
for (int i = 0; i < 4; i ++)
{
int a = x + dx[i], b = y + dy[i];
if(a < 1 || a > n || b < 1 || b > m) continue;
if(g[a][b] == 0 || st[a][b]) continue;
dfs(a, b);
}
}
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= m; j ++)
scanf("%1d", &g[i][j]);
int ans = 0;
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= m; j ++)
if(g[i][j] != 0 && !st[i][j])
{
ans ++;
dfs(i, j);
}
cout << ans << endl;
return 0;
}
题解二
BFS:
#include <iostream>
#include <cstdio>
#include <queue>
#define x first
#define y second
using namespace std;
const int N = 110;
typedef pair<int, int> PII;
int n, m;
int g[N][N];
bool st[N][N];
int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, 1, 0, -1};
void bfs(int x, int y)
{
queue<PII> q;
q.push(make_pair(x, y));
st[x][y] = true;
while(q.size())
{
PII t = q.front();
q.pop();
for (int i = 0; i < 4; i ++)
{
int a = t.x + dx[i], b = t.y + dy[i];
if(a < 1 || a > n || b < 1 || b > m) continue;
if(g[a][b] == 0 || st[a][b]) continue;
q.push(make_pair(a, b));
st[a][b] = true;
}
}
}
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= m; j ++)
scanf("%1d", &g[i][j]);
int ans = 0;
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= m; j ++)
if(g[i][j] != 0 && !st[i][j])
{
ans ++;
bfs(i, j);
}
cout << ans << endl;
return 0;
}