一道简单的搜索题。可以搜索每一个点,看这个点是否可以走到边界外,如果不可以走到,说明这个点被包围了,注意用bfs来做,(反正我用dfs超时了,不过听巨巨说他是用dfs做的,不知道怎么过了 ╮(╯▽╰)╭);
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
char a[30][30];
int b[30][30],m,n,flag;
typedef struct
{
int x,y;
} P;
P que[2000];
void bfs(int head,int tail)
{
int tx,ty,k;
int next[4][2]= {{0,1},{1,0},{0,-1},{-1,0}};
while(head<tail)
{
for(k=0; k<=3; k++)
{
tx=que[head].x+next[k][0];
ty=que[head].y+next[k][1];
if(tx<0||ty<0||tx>n-1||ty>m-1)
{
flag=1;
return;
}
if(a[tx][ty]=='.'&&b[tx][ty]==0)
{
b[tx][ty]=1;
que[tail].x=tx;
que[tail].y=ty;
tail++;
}
}
head++;
}
return;
}
int main()
{
int t,i,j,k,head,tail;
k=0;
scanf("%d",&t);
while(t--)
{
memset(a,0,sizeof(a));
scanf("%d%d",&n,&m);
for(i=0; i<n; i++)
scanf("%s",a[i]);
for(i=0; i<n; i++)
for(j=0; j<m; j++)
{
if(a[i][j]=='.')
{
head=1;
tail=1;
memset(b,0,sizeof(b));//初始化标记数组很重要;
que[tail].x=i;
que[tail].y=j;
tail++;
b[i][j]=1;
flag=0;
bfs(head,tail);
if(flag==0)
a[i][j]='*';
}
}
printf("Case %d:\n",++k);
for(i=0; i<n; i++)
puts(a[i]);
}
return 0;
}