• ZZULIoj 1908 小火山的围棋梦想


    Description

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

    Input

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

    Output

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

    Sample Input

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

    Sample Output

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


    先记录'.'的坐标,然后对第一个'.'的坐标进行深搜,搜的'.'都标记若搜到点没有在最外边的说明这些点一定被'*'包围,全部变成'*'.

     1 #include<cstdio>
     2 #include<string.h>
     3 int dx[4]={-1,1,0,0};
     4 int dy[4]={0,0,-1,1};
     5 char map[30][30];
     6 int flag[30][30];
     7 int n,m,good;
     8 struct stu
     9 {
    10     int x,y;
    11 }key[1000];
    12 void f(int xx,int yy)
    13 {    
    14     int nx,ny,i,j;
    15     if(xx==0 || xx == n-1 || yy == 0 || yy == m-1)        //判断是否是外围的点 
    16     {
    17         good=1;
    18     }
    19     for(i = 0 ; i < 4 ; i++)
    20     {
    21         nx=xx+dx[i];
    22         ny=yy+dy[i];
    23         if(nx >= 0 && ny >= 0 && nx < n && ny < m && flag[nx][ny] == 0 && map[nx][ny] == '.')
    24         {
    25             flag[nx][ny]=1;
    26             f(nx,ny);
    27         }        
    28     }
    29 }
    30 int main()
    31 {
    32     int t,s=0;
    33     
    34     scanf("%d",&t);
    35     
    36     while(t--)
    37     {
    38         int i,j,k;
    39         
    40         int num=0;
    41         
    42         scanf("%d %d",&n,&m);
    43         
    44         memset(map,'.',sizeof(map));
    45         
    46         for(i = 0 ; i < n ; i++)
    47         {
    48             scanf("%s",map[i]);
    49             for(j = 0 ; j < m ; j++)
    50             {
    51                 if(map[i][j] == '.')
    52                 {
    53                     key[++num].x=i;
    54                     key[num].y=j;
    55                 }
    56                 
    57             }
    58         }    
    59         for(i = 1 ; i <= num ; i++)
    60         {
    61             memset(flag,0,sizeof(flag));            //每次都要清零 
    62             
    63             good=0;
    64             
    65             flag[key[i].x][key[i].y]=1;
    66             
    67             if(map[key[i].x][key[i].y] == '.')
    68             
    69             f(key[i].x,key[i].y);
    70                 
    71             if(good == 0)                            //good=0说明没有最外围的点 
    72             {
    73                 for(k = 0 ; k < n ; k++)
    74                 {
    75                     for(j = 0 ; j < m ; j++)
    76                     {
    77                         if(flag[k][j] == 1)
    78                             map[k][j]='*';
    79                     }
    80                 }
    81             }
    82         } 
    83         printf("Case %d:
    ",++s);
    84         
    85         for(i = 0 ; i < n ; i++)
    86         {
    87             for(j = 0 ; j < m ; j++)
    88             {
    89                 printf("%c",map[i][j]);
    90             }
    91             
    92             printf("
    ");
    93         }
    94     }
    95 }
    
    
    
     
  • 相关阅读:
    python实现指定目录下批量文件的单词计数:串行版本
    PythonPP+lambda:示例
    python面向对象编程基础
    《平凡的世界》读后感
    代码
    【转】提高沟通效果的十个技巧
    LODOP中page-break-before:always给div分页
    LODOP超文本简短问答和相关内容
    Lodop打印较大的超出纸张的图片
    Lodop打印设计矩形重合预览线条变粗
  • 原文地址:https://www.cnblogs.com/yexiaozi/p/5758112.html
Copyright © 2020-2023  润新知