小火山的围棋梦想 多校训练2(小火山专场)Poj(DFS)

http://acm.zzuli.edu.cn/zzuliacm/problem.php?id=1908

分析:一开始很简单暴力的想着只要判断'*'是否能围成一个圈就好,但是发现好难写啊。。在比赛结束后,有人教我只需判断外围一圈的点就好,若它是'.'则对它进行标记。最后只需将未被标记的'.'变成'*'即可。

#include <stdio.h>
#include <algorithm>
#include <string.h>
#define maxn 30
using namespace std;

int dir[4][2] = {{0, 1}, {1, 0}, {-1, 0}, {0, -1}};
char maps[maxn][maxn];
int v[maxn][maxn];
int n, m;

void DFS(int x, int y)
{
    v[x][y] = 1;

    for(int i=0; i<4; i++)
    {
        int nx = x + dir[i][0];
        int ny = y + dir[i][1];

        if(nx>=0 && nx<n && ny>=0 && ny<m && maps[nx][ny]=='.' && !v[nx][ny])
             DFS(nx, ny);
    }
}
int main()
{
    int T, cnt=1;

    scanf("%d", &T);

    while(T --)
    {
        scanf("%d %d", &n, &m);

        for(int i=0; i<n; i++)
            scanf("%s", maps[i]);

        memset(v, 0, sizeof(v));

        for(int i=0; i<n; i++)
        {
            for(int j=0; j<m; j++)
            {
                if(i!=0 && j!=0 && i!=n-1 && j!=m-1) continue;

                if(maps[i][j]=='.' && !v[i][j])
                    DFS(i, j);
            }
        }

        for(int i=0; i<n; i++)
        {
            for(int j=0; j<m; j++)
            {
                if(!v[i][j] && maps[i][j]=='.')
                    maps[i][j]='*';
            }
        }

        printf("Case %d:
", cnt++);

        for(int i=0; i<n; i++)
            printf("%s
", maps[i]);

    }
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/daydayupacm/p/5763752.html