Flood Fill 连通块
从一个点扩散同色区域,统计连通块
前置内容
正文
// Flood Fill:连通块计数
// 从一个点扩散同色区域
// BFS / DFS 逐格访问
// 例:统计图中连通块个数
#include <cstdio>
char g[105][105];
int vis[105][105], n, m, ans = 0;
int dx[4] = {1, -1, 0, 0};
int dy[4] = {0, 0, 1, -1};
// 从 (x,y) 出发填色
void bfs(int x, int y) {
int qx[10005], qy[10005], h = 0, t = 0;
// 起点入队并标记
qx[t] = x; qy[t] = y; vis[x][y] = 1;
t++;
while (h < t) {
int cx = qx[h], cy = qy[h]; h++;
// 四方向扩展
for (int k = 0; k < 4; k++) {
int nx = cx + dx[k],
ny = cy + dy[k];
// 越界或已访问跳过
if (nx < 1 || ny < 1) continue;
if (nx > n || ny > m) continue;
if (vis[nx][ny]) continue;
// 同块则入队
vis[nx][ny] = 1;
qx[t] = nx; qy[t] = ny; t++;
}
}
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
scanf(" %c", &g[i][j]);
// 未访问的格子起新块
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
if (!vis[i][j]) {
bfs(i, j);
// 每发现一块计数 +1
ans++;
}
printf("%d", ans);
return 0;
}
CSP-J · 编程模板的其它内容
- 输出一句话
- 两数求和
- 矩形周长与面积
- 圆的面积
- 三数求平均值
- 摄氏转华氏
- 三位数各位拆分
- 简单本息
- 交换两个数
- 圆的周长与面积
- 三角形面积
- 梯形面积
- 长方体体积
- 英里转公里
- 总秒数换算分秒
- 商品总价与找零
- 存储单位与数据规模
- 字符编码与 ASCII
- 位运算
- 原码反码补码
- 进制转换
- 数据范围与溢出
- 时间复杂度估算
- 初赛程序阅读技巧
- 变量与数据类型
- 输入输出
- 运算符与表达式
- 分支 if/switch
- 基础循环
- 数组遍历
- 字符数组与 string
- 函数与参数传递
- 全局变量与局部变量
- 类型转换与取整
- 文件读写 freopen
- 结构体
- 指针与引用
- vector 动态数组
- string 常用操作
- algorithm 常用算法
- pair 与自定义排序
- stack 栈
- queue 队列
- priority_queue 优先队列
- set 集合
- map 映射
- lower_bound 二分
- next_permutation 全排列
- 枚举法
- 模拟
- 递归求阶乘
- 求素数
- 埃氏筛素数表
- 前缀和
- 差分
- 冒泡排序
- 插入排序
- 快速排序
- 归并排序
- 双指针