• zzuli---联赛--围棋


    围棋

    Description

      小火山最近喜欢上了围棋。
      对于围棋,其实小火山是一窍不通的。现在棋盘上,有很多小火山的棋子。 如果棋盘上有这样的一个位置, 那么这个位置也会变成小火山
    的棋子;这样的位置是指小火山的棋子将该位置围起来。
      现在,小火山想知道实际棋盘是什么样子的。 你快来帮帮他吧!

    Input

    输入第一行是一个整数T(T <= 30), 表示一共有T组数据。
    每组数据,第一行为两个整数n, m(1 <= n, m <= 25),  随后一个n*m的矩阵代表棋盘,其中"."是代表没放棋子的位置, "*"代表小火山的棋子。

    Output

    对于每组数据输出一个n*m的棋盘, 代表实际的棋盘。
     

    样例输入

    2
    3 3
    ***
    *.*
    ***
    4 4
    .*..
    *.*.
    *.*.
    .*..

    样例输出

    Case 1:
    ***
    ***
    ***
    Case 2:
    .*..
    ***.
    ***.
    .*..

    HINT

     

    Source

    zzuli

    哎呀,还是练少了吧,比赛的时候还沉不下心来,这个深搜一点也不难嘛
    1.首先从边界下手,如果边界是'.'的话,就开始进行搜索,把其本身和周围的'.'用数组vis标记为1(表示访问过)
    2.要知道深搜就是递归的过程,如果边界的周围是'.',同样此点也会向四周进行搜索
    3.那么剩下的没被标记过的'.'就代表被包围的,就将其变成'*';

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <cmath>
    #include<vector>
    #include<algorithm>
    
    using namespace std;
    typedef long long LL;
    
    const int maxn=110;
    const int INF=0x3f3f3f3f;
    
    char maps[maxn][maxn];
    int vis[maxn][maxn];
    int dir[4][2] = {{0, 1}, {1, 0}, {-1, 0}, {0, -1}};
    int m, n;
    
    void DFS(int x, int y)
    {
        vis[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]=='.'&&!vis[nx][ny])
                DFS(nx, ny);
        }
    }
    
    int main()
    {
        int T, cas=1;
        scanf("%d", &T);
    
        while(T--)
        {
            scanf("%d %d", &n, &m);
            for(int i=0; i<n; i++)
                scanf("%s", maps[i]);
    
            memset(vis, 0, sizeof(vis));
            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]=='.'&&!vis[i][j])///如果边界是'.'且没有被访问过
                        DFS(i, j);
                }
            }
    
            for(int i=0; i<n; i++)
            {
                for(int j=0; j<m; j++)
                    if(maps[i][j]=='.'&&!vis[i][j])///没有被访问过的'.'(就是被'*'包围的)将其变成'*';
                        maps[i][j]='*';
            }
    
            printf("Case %d:
    ", cas++);
            for(int i=0; i<n; i++)
                puts(maps[i]);///printf("%s
    ", maps[i]);
        }
        return 0;
    }
  • 相关阅读:
    Binary Tree
    (并查集..含小总结)A
    (超简单并查集)POJ2524 Ubiquitous Religions(8.4.4)
    OpenSees开发(一)windows 上编译opensees (使用vs2005)
    vector的push_back对于拷贝构造和赋值操作的调用
    一个指针的引用引发的血案
    MFC中由左键单击模拟左键双击引起的问题
    CLAPACK动态调用
    SVN部署(远程)客户端篇
    SVN部署(本地)
  • 原文地址:https://www.cnblogs.com/w-y-1/p/5763804.html
Copyright © 2020-2023  润新知