原文链接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 其他的更多相关文章

  1. CodeForces - 516B Drazil and Tiles(bfs)

    https://vjudge.net/problem/CodeForces-516B 题意 在一个n*m图中放1*2或者2*1的长方形,问是否存在唯一的方法填满图中的‘.’ 分析 如果要有唯一的方案, ...

  2. 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 ...

  3. 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 ...

  4. 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 ...

  5. Drazil and Tiles CodeForces - 516B (类拓扑)

    Drazil created a following problem about putting 1 × 2 tiles into an n × m grid: "There is a gr ...

  6. 【codeforces 516B】Drazil and Tiles

    题目链接: http://codeforces.com/problemset/problem/516/B 题解: 首先可以得到一个以‘.’为点的无向图,当存在一个点没有边时,无解.然后如果这个图边双联 ...

  7. Codeforces Round #292 (Div. 1) B. Drazil and Tiles (类似拓扑)

    题目链接:http://codeforces.com/problemset/problem/516/B 一个n*m的方格,'*'不能填.给你很多个1*2的尖括号,问你是否能用唯一填法填满方格. 类似t ...

  8. 【codeforces 515D】Drazil and Tiles

    [题目链接]:http://codeforces.com/contest/515/problem/D [题意] 给你一个n*m的格子; 然后让你用1*2的长方形去填格子的空缺; 如果有填满的方案且方案 ...

  9. [ CodeForces 515 D ] Drazil and Tiles

    \(\\\) \(Description\) 给出一个\(N\times M\) 的网格,一些位置是障碍,其他位置是空地,求是否存在一个用 \(1\times 2\)的骨牌铺满空地的方案,以及方案是否 ...

随机推荐

  1. linux /proc目录

    1. /proc目录Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构.改变内核设置的机制.proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间.它以文 ...

  2. LA 4108 (线段树)

    区间更新 + 统计更新长度 稍稍不注意就T了 #include<bits/stdc++.h> #define lson l, m, rt<<1 #define rson m+1 ...

  3. 腾讯云CVM之间配置免密钥登录

    背景: 1客户A和B俩台主机之间需要实现免密钥登录,已绑定腾讯云申请的密钥对 系统:centos7.3 A:192.168.0.100 B:192.168.0.84 A主机的私钥文件:aaa B主机的 ...

  4. ios中input获取焦点时的问题

    1.获取焦点时,input会变大 解决办法是:font-size设置为32px以上 还有就是要在header里面加这一行代码:<meta name="viewport" co ...

  5. 细说Django的中间件

    分析Django的生命周期,我们知道所有的http请求都要经过Django的中间件. 假如现在有一个需求,所有到达服务端的url请求都在系统中记录一条日志,该怎么做呢? Django的中间件的简介 D ...

  6. Confluence 6 Oracle 创建数据库用户

    创建用户后并且指派权限: 使用 sqlplus 命令行工具通过命令行来访问 Oracle sqlplus user/password <as sysdba|as sysoper> 如果你的 ...

  7. caffe2安装

    参考http://blog.csdn.net/Andy965/article/details/70808909?locationNum=5&fps=1 建议将make 和make instal ...

  8. Meta标签详解

    [转载]Meta标签详解 Posted on 2005-05-17 20:00 二十四画生 阅读(54195) 评论(102)  编辑 收藏 Meta标签详解,在网上转的,希望对大家有用 引言 您的个 ...

  9. Python编程:从入门到实践(选记)

    本文参考< Python 编程:从入门到实践>一书,作者: [ 美 ] Eric Matthes 第1章 起步 1.1     搭建python环境 在不同的操作系统中, Python 存 ...

  10. 登录界面之Axure原型制作

    *****登录界面制作步骤***** 1.背景色:需要设定的背景色不知道色值,可以使用截图工具截取一小块粘贴到axure页面, 点击页面样式中的背景色左上角的取色器点击一下该色块,即可将背景色全部填充 ...