65.广搜练习:细胞数目
输入处理:读取矩阵的行数和列数,并将每个字符转换为对应的数字,存储在二维数组中。 访问标记:创建一个同样大小的二维数组来记录每个单元格是否已经被访问过。 BFS遍历:对于每个未被访问过的1,启动BFS,将所有连通的1标记为已访问,并计数加一。 队列处理:在BFS中,使用队列来逐层扩展,处理四个方向(上、下、左、右)的单元格,确保每个单元格只被访问一次。 输入处理:读取矩阵的行数和列数,然后读取每一行字符串并转换为数字,存储在二维数组 访问标记数组: BFS函数:对于每个未被访问过的1,启动BFS,标记所有连通的1,并使用队列处理四个方向的单元格,直到队列为空。 主函数:遍历矩阵,启动BFS处理每个未被访问的1,最后输出计数器的值。
发布日期:2025-06-07 17:43:40
浏览次数:4
分类:精选文章
本文共 2098 字,大约阅读时间需要 6 分钟。
为了解决这个问题,我们需要计算给定矩阵中的细胞个数。细胞由数字1到9组成,相邻的数字(上下左右)属于同一个细胞。我们可以使用广度优先搜索(BFS)来遍历矩阵,标记访问过的细胞,避免重复计算。
方法思路
解决代码
#include#include #include using namespace std;int m, n;int jz[1001][1001];bool visited[1001][1001];int sum = 0;queue > q;void input() { cin >> m >> n; for (int i = 1; i <= m; ++i) { string s; cin >> s; for (int j = 1; j <= n; ++j) { jz[i][j] = s[j-1] - '0'; if (jz[i][j] != 0) { visited[i][j] = false; } else { visited[i][j] = false; } } }}void bfs(int i, int j) { if (i < 1 || i > m || j < 1 || j > n) { return; } if (jz[i][j] != 1) { return; } if (visited[i][j]) { return; } visited[i][j] = true; q.push({i, j}); sum++; int dx[] = {-1, 1, 0, 0}; int dy[] = {0, 0, -1, 1}; while (!q.empty()) { auto current = q.front(); q.pop(); int x = current.first; int y = current.second; for (int d = 0; d < 4; ++d) { int nx = x + dx[d]; int ny = y + dy[d]; if (nx >= 1 && nx <= m && ny >= 1 && ny <= n) { if (jz[nx][ny] == 1 && !visited[nx][ny]) { visited[nx][ny] = true; q.push({nx, ny}); } } } }}int main() { input(); for (int i = 1; i <= m; ++i) { for (int j = 1; j <= n; ++j) { if (jz[i][j] == 1 && !visited[i][j]) { bfs(i, j); } } } cout << sum << endl; return 0;}
代码解释
jz中。visited数组记录每个单元格是否已被访问。该方法使用BFS高效地遍历矩阵,确保每个单元格只被访问一次,时间复杂度为O(mn),适用于较大的矩阵。
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2026年06月14日 12时39分40秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!