题解 [CF525D] Arthur and Walls
解析
首先考虑将一个\('*'\)变成\('.'\)后会形成什么,
显然至少是一个\(2\times 2\)的矩形.
因为\(1\times 1\)和\(1\times 2\)的改了没用啊,
而我们考虑什么时候应该把\('*'\)改掉,
对于一个矩形,它可以看成若干个可能重叠的\(2\times 2\)的矩形,
而在一个\(2\times 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;
}
题解 [CF525D] Arthur and Walls的更多相关文章
- Codeforces Round #297 (Div. 2)D. Arthur and Walls 暴力搜索
Codeforces Round #297 (Div. 2)D. Arthur and Walls Time Limit: 2 Sec Memory Limit: 512 MBSubmit: xxx ...
- Codeforces Round #297 (Div. 2) D. Arthur and Walls [ 思维 + bfs ]
传送门 D. Arthur and Walls time limit per test 2 seconds memory limit per test 512 megabytes input stan ...
- Codeforces Round #297 (Div. 2) 525D Arthur and Walls(dfs)
D. Arthur and Walls time limit per test 2 seconds memory limit per test 512 megabytes input standard ...
- BFS Codeforces Round #297 (Div. 2) D. Arthur and Walls
题目传送门 /* 题意:问最少替换'*'为'.',使得'.'连通的都是矩形 BFS:搜索想法很奇妙,先把'.'的入队,然后对于每个'.'八个方向寻找 在2*2的方格里,若只有一个是'*',那么它一定要 ...
- 「CF525D」Arthur and Walls
题目链接 戳我 \(Solution\) 如果一个#要更改,那么一个四个格子的正方形只有他一个是#,bfs弄一下就好了 \(Code\) #include<bits/stdc++.h> u ...
- CodeForces 525D Arthur and Walls
广搜.看了官方题解才会的..... 定义2*2的小矩阵,有三个是点,一个是星,这样的小矩阵被称为元素块. 首先把所有元素块压入队列,每次取出对头,检查是否还是元素块,如果是 那么将那个*改为点,否则跳 ...
- 【Henu ACM Round#18 F】Arthur and Walls
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 考虑,为什么一个连通块里面的空格没有变成一个矩形? 如果不是形成矩形的话. 肯定是因为某个2x2的单张方形里面. 只有一个角是墙.其 ...
- cf 525D.Arthur and Walls
判断2*2的正方形,是不是3个"."1个"*"然后暴力bfs就好.(这种处理也是挺神奇的2333%%题解) #include<bits/stdc++.h& ...
- Arthur and Walls CodeForces - 525D (bfs)
大意: 给定格点图, 每个'.'的连通块会扩散为矩形, 求最后图案. 一开始想得是直接并查集合并然后差分, 但实际上是不对的, 这个数据就可以hack掉. 3 3 **. .** ... 正解是bfs ...
随机推荐
- emacs 常用命令
C stands for Ctrl and M stands for Alt REFERENCE FORM EMACS TUTORIAL 表述不一定正确,仅供参考,主要是要多实践,一开始可能会不习惯 ...
- PostgreSQL 修改设置数据库的默认用户以及权限.
1. 登录PG数据库. psql -U postgres 界面效果为: [root@centos76 ~]# psql -U postgres psql (10.7) Type "help& ...
- [转帖]Kafka 原理和实战
Kafka 原理和实战 https://segmentfault.com/a/1190000020120043 两个小时读完... 实在是看不完... 1.2k 次阅读 · 读完需要 101 分钟 ...
- java知识随笔整理-数据库的临时表
1.创建临时表的方法 方法一.select * into #临时表名 from 你的表; 方法二. create table #临时表名(字段1 约束条件,字段2 约束条件,.....)create ...
- springboot+mybatis 用redis作二级缓存
1.加入相关依赖包: <?xml version="1.0" encoding="UTF-8"?> <project xmlns=" ...
- 虚拟机(VM)安装openwrt-koolshare软路由
⒈创建虚拟机 **软路由选择Windows操作系统,因为我们需要在PE环境中进行软路由的写入,固件类型选择BIOS,网络类型选择使用仅主机模式网络,虚拟磁盘类型选择IDE[一定要选择IDE模式],SC ...
- 级联-city
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title> ...
- X86驱动:挂接SSDT内核钩子
SSDT 中文名称为系统服务描述符表,该表的作用是将Ring3应用层与Ring0内核层,两者的API函数连接起来,起到承上启下的作用,SSDT并不仅仅只包含一个庞大的地址索引表,它还包含着一些其它有用 ...
- DVWA漏洞演练平台 - 文件上传
DVWA(Damn Vulnerable Web Application)是一个用来进行安全脆弱性鉴定的PHP/MySQL Web应用,旨在为安全专业人员测试自己的专业技能和工具提供合法的环境,帮助w ...
- 由[].slice.call()引发的思考
由[].slice.call()引发的思考 经常看到大家用[].slice.call()或者Array.prototype.slice.call(): 我一直是一知半解的,今天算是基本弄清楚了, ...