zoukankan      html  css  js  c++  java
  • 题解 [CF525D] Arthur and Walls

    题面

    解析

    首先考虑将一个('*')变成('.')后会形成什么,

    显然至少是一个(2 imes 2)的矩形.

    因为(1 imes 1)(1 imes 2)的改了没用啊,

    而我们考虑什么时候应该把('*')改掉,

    对于一个矩形,它可以看成若干个可能重叠的(2 imes 2)的矩形,

    而在一个(2 imes 2)的矩形中,

    如果有三个是('.'),一个是('*')的话,这个('*')就要改掉,

    要不然是不可能拼成矩形的.

    (感性理解下吧...)

    所以直接对于每个('*'),

    判断它需不需要改掉,

    (dfs)更新旁边的格子就行了.

    (不知道为什么旁边的lzf大仙用(bfs)一直T)

    code:(代码实现的时候有些巧妙的地方)

    #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;
    }
    
  • 相关阅读:
    jenkins部署前端node项目实例
    阿里云云盘扩容数据盘_Linux
    输入子系统
    触摸屏设备驱动程序
    LCD设备驱动程序
    IIC设备驱动程序
    看门狗驱动程序
    RTC实时时钟驱动
    网络设备驱动程序数据结构
    Linux 设备驱动模型
  • 原文地址:https://www.cnblogs.com/zsq259/p/11512302.html
Copyright © 2011-2022 走看看