题意:*是墙,.是空点,要求拆墙使得所有连续的空点必须组成矩形,并且拆最少的墙。输出最后的结果。
思路:如果对于一个墙点,其周围的8个点中,有三个空点组成一个角,那么这个墙就要拆。一直搜索直到最后不存在这样的点。
AC代码如下:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,m;
char s[2010][2010];
int _x[8]={-1,-1,0,1,1,1,0,-1},_y[8]={0,1,1,1,0,-1,-1,-1};
void solve(int x,int y)
{
if(s[x][y]=='.')
return;
if(s[x-1][y-1]=='.' && s[x-1][y]=='.' && s[x][y-1]=='.')
s[x][y]='.';
else if(s[x-1][y+1]=='.' && s[x-1][y]=='.' && s[x][y+1]=='.')
s[x][y]='.';
else if(s[x+1][y+1]=='.' && s[x+1][y]=='.' && s[x][y+1]=='.')
s[x][y]='.';
else if(s[x+1][y-1]=='.' && s[x+1][y]=='.' && s[x][y-1]=='.')
s[x][y]='.';
if(s[x][y]=='.')
{
for(int k=0;k<8;k++)
solve(x+_x[k],y+_y[k]);
}
}
int main()
{
int i,j,k;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
scanf("%s",s[i]+1);
for(i=0;i<=m+1;i++)
s[0][i]=s[n+1][i]='*';
for(i=0;i<=n+1;i++)
s[i][0]=s[i][m+1]='*';
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
solve(i,j);
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
printf("%c",s[i][j]);
printf("\n");
}
}