本文用以展示种子填充在探究八连块个数的应用。
八连块: * * * @
* * @ *
@ * * @
上述图形中有两个八连块。 横竖,对角即算连接,求不能连接在一起的最小块数。
1 #include<cstdio> 2 #include<cstring> 3 const int maxn = 100 + 5; 4 5 char pic[maxn][maxn]; 6 int m, n, idx[maxn][maxn]; 7 8 void dfs(int r, int c, int id) { 9 if (r < 0 || r >= m || c < 0 || c >= n) return; 10 if (idx[r][c] > 0 || pic[r][c] != '@') return; 11 idx[r][c] = id; 12 for (int dr = -1; dr <= 1; dr++) 13 for (int dc = -1; dc <= 1; dc++) 14 if (dr != 0 || dc != 0) dfs(r + dr, c + dc, id); 15 } 16 17 18 int main() { 19 while (scanf("%d%d", &m, &n) == 2 && m && n) { 20 for (int i = 0; i < m; i++) scanf("%s", pic[i]); 21 memset(idx, 0, sizeof(idx)); 22 int cnt = 0; 23 for (int i = 0; i < m; i++) 24 for (int j = 0; j < n; j++) 25 if (idx[i][j] == 0 && pic[i][j] == '@') dfs(i, j, ++cnt); 26 printf("%d\n", cnt); 27 } 28 return 0; 29 }