您的位置:首页 > 其它

小火山的围棋梦想

2016-08-13 11:54 232 查看

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:

.*..

***.

***.

.*..
在做这道题是我可以想到搜到边界就不用被*化,但是我没想到如何把一个一个被困住的.给变成*;
现在知道了,找个字母标记一下,看代码吧。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char map[30][30];
int vis[30][30];
int dx[4]={1,-1,0,0};
int dy[4]={0,0,-1,1};
int m,n,good;
void dfs(int u,int v)
{
int i;
if(u==0||u==n-1||v==0||v==m-1)
{
good=1;
return ;
}
for(i=0;i<4;i++)
{
int xx=u+dx[i];
int yy=v+dy[i];
if(xx>=0&&xx<=n-1&&yy>=0&&yy<=m-1&&map[xx][yy]=='.'&&!vis[xx][yy])
{
vis[xx][yy]=1;
dfs(xx,yy);
}
}
return;
}
int main()
{
int t,i,j,k,h=1;
scanf("%d",&t);
while(t--)
{
int num=0;
//memset(map,'.',sizeof(map));
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)
scanf("%s",map[i]);
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
if(map[i][j]=='.')
{
memset(vis,0,sizeof(vis));
good=0;dfs(i,j);
vis[i][j]=1;
if(good==0)
map[i][j]='*';
}
}
}

printf("Case %d:\n",h++);
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
printf("%c",map[i][j]);
printf("\n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: