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:\n",++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("\n");
93         }
94     }
95 }

 

 
posted @ 2016-08-10 19:49  野小子&  阅读(253)  评论(0编辑  收藏  举报