POJ-2386

动态规划入门题

  • 我的写法
  • 大神的写法

我的写法

#include 
#include 
#include 
using namespace std;
/*
算法:
1.先处理边界
2.再处理访问过的点
3.最后考虑递归
4*.另外该程序还可求得每一块水池的大小(取消代码里的注释即可)
*/

int n = 0, m = 0;
char field[110][110];
int result[10000] = {0}, p = 0, step[110][110] = {0};

void dfs(int i, int j){
    if(i < 0 || j < 0 || i == n || j == m || step[i][j] != 0)
        return;

    if(step[i][j] == 0 && field[i][j] == '.'){
        step[i][j] = 1;
        return;
    }
    if(step[i][j] == 0 && field[i][j] == 'W'){
        step[i][j] = 1;
        result[p] += 1;
        field[i][j] = '.';
        dfs(i - 1, j);
        dfs(i + 1, j);
        dfs(i, j - 1);
        dfs(i, j + 1);
        dfs(i - 1, j - 1);
        dfs(i - 1, j + 1);
        dfs(i + 1, j - 1);
        dfs(i + 1, j + 1);
    }
}


int main()
{
    scanf("%d%d", &n, &m);
    for(int i = 0; i < n; i++)
        scanf("%s", field[i]);

    for(int i = 0; i < n; i++)
        for(int j = 0; j < m; j++){
            dfs(i, j);
            if(result[p] != 0)
                p++;
        }

//    for(int i = 0; i < 120; i++)
//        printf("%d ", result[i]);
    printf("%d", p);

    return 0;
}

大神的写法

#include 
#include 
#include 
using namespace std;
/*
算法:
1.先处理边界
2.再处理访问过的点
3.最后考虑递归
*/

int n = 0, m = 0;
char field[110][110];

void dfs(int i, int j){
    field[i][j] = '.';
    for(int dx = -1; dx <= 1; dx++)
        for(int dy = -1; dy <= 1; dy++){
            int x = i + dx, y = j + dy;
            if(x >= 0 && x < n && y >= 0 && y < m && field[x][y] == 'W')
                dfs(x, y);
        }
    return;
}

int main()
{
    scanf("%d%d", &n, &m);
    for(int i = 0; i < n; i++)
        scanf("%s", field[i]);
    int res = 0;
    for(int i = 0; i < n; i++)
        for(int j = 0; j < m; j++){
            if(field[i][j] == 'W'){
                dfs(i, j);
                res++;
 			}       
        }
    printf("%d", res);

    return 0;
}

你可能感兴趣的:(c++,POJ)