CodeForces 516B Drazil and Tiles 其他
原文链接http://www.cnblogs.com/zhouzhendong/p/8990658.html
题目传送门 - CodeForces 516B
题意
给出一个$n\times m$的矩形。其中有些位置已经被覆盖。
现在让你用$1\times 2$的小矩形来覆盖其他地方,小矩形不能重叠。
如果有多种覆盖方案,或者无法把没被覆盖的地方全部覆盖,那么输出特殊信息。否则输出唯一的方案。
$n,m\leq 2000$
题解
乍一看,我还以为是经典的二分图匹配题目。但是由于$n,m$都很大,所以不行。
注意到题意概括中第$3$行的特殊性。
我们考虑这样一个算法:
首先,如果原矩阵中有被四面包围的空地,那么显然无解。
对于原矩阵中被三面包围的空地,显然只有一种方法可以填充这个空地。
我们考虑使用一个队列,一开始加入被三面包围的空地,然后在填充的过程中,影响到了其他的空地,并加入新的待填充空地。
在填充的过程中可以顺便判掉某些无解的情况。
如果按照上述操作,无法把矩阵填充满,那么就是无解或者多解了。
至于多解的情况,很显然,任何一块连通空地如果不能找到被三面包围的空地,那么显然有多种方案来填充。
至于为什么,自己yy。
代码
#include <bits/stdc++.h>
using namespace std;
const int N=2005;
int dx[4]={ 0, 0, 1,-1};
int dy[4]={-1, 1, 0, 0};
int n,m;
char g[N][N];
int head=0,tail=0,x[N*N],y[N*N];
bool flag=1;
void ckadd(int i,int j){
if (g[i][j]!='.')
return;
int cnt=0;
for (int k=0;k<4;k++)
if (g[i+dx[k]][j+dy[k]]=='.')
cnt++;
if (cnt==1)
tail++,x[tail]=i,y[tail]=j;
if (cnt==0)
flag=0;
}
int main(){
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
scanf("%s",g[i]+1);
for (int i=1;i<=n;i++)
g[i][0]=g[i][m+1]='*';
for (int i=1;i<=m;i++)
g[0][i]=g[n+1][i]='*';
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
ckadd(i,j);
while (head<tail&&flag){
head++;
int i=x[head],j=y[head];
if (g[i][j]!='.')
continue;
int cnt=0;
for (int k=0;k<4;k++)
if (g[i+dx[k]][j+dy[k]]=='.'){
cnt++;
if (k==0)
g[i][j]='>',g[i+dx[k]][j+dy[k]]='<';
if (k==1)
g[i][j]='<',g[i+dx[k]][j+dy[k]]='>';
if (k==2)
g[i][j]='^',g[i+dx[k]][j+dy[k]]='v';
if (k==3)
g[i][j]='v',g[i+dx[k]][j+dy[k]]='^';
for (int t=0;t<4;t++)
ckadd(i+dx[k]+dx[t],j+dy[k]+dy[t]);
}
if (cnt==0)
flag=0;
}
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
if (g[i][j]=='.')
flag=0;
if (!flag)
puts("Not unique");
else {
for (int i=1;i<=n;i++,puts(""))
for (int j=1;j<=m;j++)
putchar(g[i][j]);
}
return 0;
}
CodeForces 516B Drazil and Tiles 其他的更多相关文章
- CodeForces - 516B Drazil and Tiles(bfs)
https://vjudge.net/problem/CodeForces-516B 题意 在一个n*m图中放1*2或者2*1的长方形,问是否存在唯一的方法填满图中的‘.’ 分析 如果要有唯一的方案, ...
- Codeforces Round #292 (Div. 1) B. Drazil and Tiles 拓扑排序
B. Drazil and Tiles 题目连接: http://codeforces.com/contest/516/problem/B Description Drazil created a f ...
- Codeforces Round #292 (Div. 1) - B. Drazil and Tiles
B. Drazil and Tiles Drazil created a following problem about putting 1 × 2 tiles into an n × m gri ...
- Codeforces Round #292 (Div. 2) D. Drazil and Tiles [拓扑排序 dfs]
传送门 D. Drazil and Tiles time limit per test 2 seconds memory limit per test 256 megabytes Drazil cre ...
- Drazil and Tiles CodeForces - 516B (类拓扑)
Drazil created a following problem about putting 1 × 2 tiles into an n × m grid: "There is a gr ...
- 【codeforces 516B】Drazil and Tiles
题目链接: http://codeforces.com/problemset/problem/516/B 题解: 首先可以得到一个以‘.’为点的无向图,当存在一个点没有边时,无解.然后如果这个图边双联 ...
- Codeforces Round #292 (Div. 1) B. Drazil and Tiles (类似拓扑)
题目链接:http://codeforces.com/problemset/problem/516/B 一个n*m的方格,'*'不能填.给你很多个1*2的尖括号,问你是否能用唯一填法填满方格. 类似t ...
- 【codeforces 515D】Drazil and Tiles
[题目链接]:http://codeforces.com/contest/515/problem/D [题意] 给你一个n*m的格子; 然后让你用1*2的长方形去填格子的空缺; 如果有填满的方案且方案 ...
- [ CodeForces 515 D ] Drazil and Tiles
\(\\\) \(Description\) 给出一个\(N\times M\) 的网格,一些位置是障碍,其他位置是空地,求是否存在一个用 \(1\times 2\)的骨牌铺满空地的方案,以及方案是否 ...
随机推荐
- ASP.NET MVC5高级编程 之 视图
1.1理解视图约定 当创建一个项目模版时,可以注意到,项目以一种非常具体的方式包含了一个结构化的Views目录.在每一个控制器的View文件夹中,每一个操作方法都有一个同名的视图文件与其对应.这就提供 ...
- 自定义session,cookie
第一种情况:没有设置缓存:执行相对应的setitem等方法进行,保存到字典里面 cookies_dic={}print(cookies_dic)class Session(): def __init_ ...
- 在v-html中,js 正则表达式清除字符串里的style属性
项目中遇到这样的需求,后端返回的是字符串,在vue用v-html显示,里面有style样式,要去除style 在v-html中使用filters,和平时的不一样,推荐项目的方法,定义一个全局的过滤方法 ...
- LuoGu P1006 传纸条
题目传送门 这题嘛...方格取数和这题一样一样的 只不过这题是从左上到右下再回去罢了(来回一趟和来两趟有区别么?没有,那么这题和上题用一样的转移和状态就行了 没什么好说的,说一下我的错误好了: 人家图 ...
- C3盒子弹性布局
有效的对一个容器中的子元素进行排列.对齐和分配空白空间. 对浏览器版本要求较高,多用于移动端的响应式设计 flex-direction 顺序指定了弹性子元素在父容器中的位置. flex-directi ...
- 软件测试-历史bug回顾(持续更新~)
1.第一次编写程序的时候非常不容易看出的错误就是 = 和 == 的区别. 赋值符号,判断符号之间有着天差地别.导致一直循环错误,一直苦苦找寻愿意无果,一步步看代码解决. 2.对于终结条件判断不是很清楚 ...
- ORA-00379: no free buffers available in buffer pool DEFAULT for block size 16K
SYS@orcl> select TABLESPACE_NAME ,AUTOEXTENSIBLE from dba_data_files ; ERROR: ORA-00379: no free ...
- select下拉框的数据回显
需求描述:select框,下拉后又很多的选项,选择一个,根绝后台代码做查询,完成之后,页面上的select框还是之前选的那个值 解决思路:select本质就是 value和text一一对应,根据你的s ...
- Web前端渗透测试技术小结(一)
首先端正一下态度不可干违法的事 1.SQL注入测试 对于存在SQL注入的网页,使用SQL语句进行关联查询(仿照C/S模式)eg http://www.foo.com/user.php?id=1 常 ...
- requests中get和post传参
get请求 get(url, params=None, **kwargs) requests实现get请求传参的两种方式 方式一: import requests url = 'http://www. ...