题目说的是有一个n*m的矩阵,元素是'.'或'*',要求把尽可能少的'*'变成'.',使得所有'.'的区域都是矩形。
想了好些方法,最后看了题解。。其实这题的关键是想到如果某个2*2的矩阵内有3个'.',那么剩下的那个'*'也应该变成'.'。想到这个以后,搜一下就可以了。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <stack>
#include <vector>
#include <deque>
#include <set>
#include <queue>
using namespace std;
const int maxn=2010;
char mp[maxn][maxn];
int dirn[]={-1,-1,-1,0,0,1,1,1};
int dirm[]={-1,0,1,-1,1,-1,0,1};
int n,m;
bool judge(int i,int j){
if(mp[i][j-1]=='.'&&mp[i-1][j-1]=='.'&&mp[i-1][j]=='.'){
return true;
}
if(mp[i-1][j]=='.'&&mp[i-1][j+1]=='.'&&mp[i][j+1]=='.'){
return true;
}
if(mp[i][j+1]=='.'&&mp[i+1][j+1]=='.'&&mp[i+1][j]=='.'){
return true;
}
if(mp[i+1][j]=='.'&&mp[i+1][j-1]=='.'&&mp[i][j-1]=='.'){
return true;
}
return false;
}
void dfs(int nn,int mm){
for(int i=0;i<8;i++){
if(mp[nn+dirn[i]][mm+dirm[i]]=='*'){
if(judge(nn+dirn[i],mm+dirm[i])){
mp[nn+dirn[i]][mm+dirm[i]]='.';
dfs(nn+dirn[i],mm+dirm[i]);
}
}
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
scanf("%s",mp[i]+1);
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(mp[i][j]=='*'){
if(judge(i,j)){
mp[i][j]='.';
dfs(i,j);
}
}
}
}
for(int i=1;i<=n;i++){
printf("%s\n",mp[i]+1);
}
return 0;
}