UVA - 572_Oil Deposits(FloodFill)

要求:计算二维中连通块个数。

#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. 限定进入递归的条件,而省掉返回条件。

上一篇:题目--oil Deposits(油田) 基础DFS(深度搜索)


下一篇:Python3 str去除空格