問題[CF525D]アーサーと城壁がソリューション

フェイス質問

解決

まず、考える\を( '*' \)となり\( '' \)どのような形の会議の後、

どうやら、少なくとも\(* 2 2 \)長方形。

ので\(1 * 1 \)\(1 * 2 \)は、ああ無駄変更されます

私たちが考えるときとすべきである(\「*」)\、を取り除くために

潜在的に重複の数と見なすことができる長方形のため(2 * 2 \)\矩形を、

\(2 * 2 \)矩形で

ある場合は3 \は( '' \) です\(\ '*') この\は( '*' \)を取り除くことが必要であり、

それ以外の場合は、四角形を綴ることは不可能です。

(誘導はそれを理解して...)

そのため、それぞれの直接のための\( '*' \)

または必要性を取り除くために決定されます

では\(DFS \)リスト上の次のグリッドを更新します。

(とLZF次のマーチングなぜ分からないのです\(BFS \)が Tとなっています)

コード:(いくつかの巧妙な場所のタイムコードの実装)

#include <iostream>
#include <cstdio>
#include <cstring>
#define fre(x) freopen(x".in","r",stdin),freopen(x".out","w",stdout)
using namespace std;

inline int read(){
    int sum=0,f=1;char ch=getchar();
    while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0' && ch<='9'){sum=sum*10+ch-'0';ch=getchar();}
    return f*sum;
}

const int N=2005;
int n,m,a[N][N];
int pl,pr,tl,tr;
int que[N*N][3],vis[N][N];
int sta[N*N][3],top;
int dx[5]={-1,0,1,0,-1},dy[5]={0,1,0,-1,0};
char ss[N];

inline void dfs(int x,int y){
    if(a[x][y]) return ;
    if(x>n||y>m||!x||!y) return ;
    for(int k=0;k<4;k++){
        int x1=x+dx[k],y1=y+dy[k];
        int x2=x+dx[k+1],y2=y+dy[k+1];
        int x3=x+(dx[k]?dx[k]:dx[k+1]),y3=y+(dy[k]?dy[k]:dy[k+1]);
        if(a[x1][y1]&&a[x2][y2]&&a[x3][y3]){
            a[x][y]=1;
            for(int i=x-1;i<=x+1;i++)
                for(int j=y-1;j<=y+1;j++) dfs(i,j);
            return ;
        }
    }
}

int main(){
    n=read();m=read();
    for(int i=1;i<=n;i++){
        cin>>ss;
        for(int j=1;j<=m;j++) a[i][j]=(ss[j-1]=='.');
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++) dfs(i,j);
    }
    for(int i=1;i<=n;i++,puts(""))
        for(int j=1;j<=m;j++) printf("%c",a[i][j]? '.':'*');
    return 0;
}

おすすめ

転載: www.cnblogs.com/zsq259/p/11512302.html