Codeforces Round #297 (Div. 2) D

来源:互联网 发布:毒药 知乎 编辑:程序博客网 时间:2024/06/05 11:40

Arthur and Walls

        题目说的是有一个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;}


0 0