原文链接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;
}

  

最新文章

  1. [LeetCode] Combinations 组合项
  2. 伪装的方式实现js继承
  3. 解析大型.NET ERP系统 20条数据库设计规范
  4. Mysql 常用函数
  5. python_day3
  6. StarUml:Exception EOleSysError in module StarUML.ex
  7. 【转载】linux tail命令的使用方法详解
  8. &lt;area&gt; 标签
  9. IIS由于无法创建应用程序域,因此未能执行请求。错误: 0x80070005 拒绝访问
  10. [三]JFreeChart实践二
  11. ZOJ Problem Set - 3758 素数
  12. 利用Windows性能计数器(PerformanceCounter)监控
  13. tomcat中的线程问题2
  14. Git漏洞允许任意代码执行(CVE-2018-17456)复现
  15. Java开发笔记(七十二)Java8新增的流式处理
  16. Pycharm中Django安装配置Mongodb
  17. SVN用法及常见问题分析
  18. [PHP] 算法-字符串的全排列的PHP实现
  19. 通过System.CommandLine快速生成支持命令行的应用
  20. 【6集iCore3_ADP触摸屏驱动讲解视频】6-2 基于FSMC总线的ARM与FPGA通信

热门文章

  1. git bash的命令
  2. 微信小程序—获取用户网络状态和设备的信息
  3. 4)django-视图view
  4. 解决KafKa数据存储与顺序一致性保证
  5. 安卓易学,爬坑不易—腾讯老司机的RecyclerView局部刷新爬坑之路
  6. Confluence 6 允许其他用户编辑站点欢迎消息
  7. test pictures
  8. js模块化编程之CommonJS和AMD/CMD
  9. PDF如何设置书签,怎么在PDF上添加书签
  10. java Swing组件和事件处理