zoukankan      html  css  js  c++  java
  • 小火山的围棋梦想 多校训练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
  • 相关阅读:
    第六周
    第五周
    第四周
    第二周学习记录
    实验一 Linux初步认识
    java实验四
    java实验三
    为什么无密码认证能够有效
    关于父元素,子元素,同级元素的DOM操作技巧
    高效设计构建软件的十三条建议
  • 原文地址:https://www.cnblogs.com/daydayupacm/p/5763752.html
Copyright © 2011-2022 走看看