DFS 遍历图
链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=513
种子填充算法:(flood fill)
Flood fill算法是从一个区域中提取若干个连通的点与其他相邻区域区分开(或分别染成不同颜色)的经典算法。
---- Wikipedia
Flood fill算法接受三个参数:起始节点,目标颜色和替换颜色。算法遍历所有的节点以寻找和起始节点相连的节点(通过一条目标颜色的路径相连),然后 改变他们的颜色为替换颜色。目前有许多flood-fill算法的构建方式,但是他们都显示或隐式的使用队列或者栈 根据我们是否考虑当前节点对角线方向的节点,算法分为四路算法(不考虑对角线方向的节点)和八路算法(考虑对角线方向的节点)。
#include <cstdio> #include <cstring> using namespace std; const int maxn = 100 + 5; char pic[maxn][maxn]; int m, n, idx[maxn][maxn]; void dfs(int r, int c, int id) { if(r < 0 || r > m || c < 0 || c > n) { return; } if(idx[r][c] > 0 || pic[r][c] != '@') return; idx[r][c] = id; for(int dr = -1; dr <= 1; dr++) { for(int dc = -1; dc <= 1; dc++) { if(dr != 0 || dc != 0) { dfs(r + dr, c + dc, id); } } } } int main() { while(scanf("%d%d", &m, &n) == 2 && m && n) { for(int i = 0; i < m; i++) { scanf("%s", pic[i]); } memset(idx, 0, sizeof(idx)); int cnt = 0; for(int i = 0; i < m; i++) { for(int j = 0; j < n; j++) { if(idx[i][j] == 0 && pic[i][j] == '@') { dfs(i, j, ++cnt); } } } printf("%d\n", cnt); } return 0; }