要求:计算二维中连通块个数。
#include<bits/stdc++.h> using namespace std; const int maxn = 100 + 3; const int maxm = 100 + 3; int m, n; char buf[maxm][maxn]; bool book[maxm][maxn]; void floodfill(int r, int c) { book[r][c] = true; for(int dr = -1; dr < 2; dr++){ for(int dc = -1; dc < 2; dc++){ int rr = r + dr, cc = c + dc; if((rr < m && rr >= 0 && cc < n && cc >= 0) && buf[rr][cc] == '@' && !book[rr][cc]){ floodfill(rr, cc); } } } } int main() { while(cin >> m >> n && m && n){ memset(book, 0, sizeof(book)); for(int i = 0; i < m; i++){ scanf("%s", buf[i]); } int cnt = 0; for(int i = 0; i < m; i++){ for(int j = 0; j < n; j++){ if(buf[i][j] == '@' && !book[i][j]){ floodfill(i, j); cnt++; } } } cout << cnt << endl; } }
收获:
递归框架可以有两种类型:
1. 显式写明递归边界,即递归中的返回条件。
2. 限定进入递归的条件,而省掉返回条件。