一矩形阵列由数字 0 到 9 组成,数字 1 到 9 代表细胞,细胞的定义为沿细胞数字上下左右若还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。c++
时间: 2023-05-30 15:05:30 浏览: 49
思路:
遍历整个矩阵,对于每个数字为 1~9 的格子,使用DFS或BFS搜索其所在的细胞。搜索时,从当前格子出发,分别向上、下、左、右四个方向搜索,如果邻格数字为 1~9,则继续搜索该邻格,否则停止搜索。搜索到的所有格子组成一个细胞,标记为已访问,继续寻找下一个未访问的数字为 1~9 的格子,重复以上过程,直到整个矩阵遍历完毕。
代码实现:
以下是使用DFS实现的代码,使用了一个visited数组记录每个格子是否已被访问过,search函数用于从当前格子出发搜索细胞。时间复杂度为O(n^2),其中n为矩阵的边长。
```c
#include <stdio.h>
#define MAX_N 100
int n, m; // 矩阵的行数和列数
int a[MAX_N][MAX_N]; // 矩阵
int visited[MAX_N][MAX_N]; // 记录每个格子是否已被访问过
// 搜索以(x,y)为起点的细胞
void search(int x, int y) {
if (visited[x][y]) return; // 如果已经访问过,直接返回
visited[x][y] = 1; // 标记为已访问
int dx[] = {-1, 0, 1, 0}; // 上下左右四个方向
int dy[] = {0, 1, 0, -1};
for (int i = 0; i < 4; i++) {
int nx = x + dx[i], ny = y + dy[i];
if (nx >= 0 && nx < n && ny >= 0 && ny < m && a[nx][ny] != 0) {
// 如果邻格数字为1~9,继续搜索
search(nx, ny);
}
}
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
scanf("%d", &a[i][j]);
}
}
int cnt = 0; // 细胞个数
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (a[i][j] != 0 && !visited[i][j]) {
// 如果当前格子数字为1~9且未被访问过,搜索该细胞
cnt++;
search(i, j);
}
}
}
printf("%d\n", cnt);
return 0;
}
```