Codeforces Round #292 (Div. 1) B. Drazil and Tiles (类似拓扑)
2016-08-05 21:00
513 查看
题目链接:http://codeforces.com/problemset/problem/516/B
一个n*m的方格,'*'不能填。给你很多个1*2的尖括号,问你是否能用唯一填法填满方格。
类似topsort,'.'与上下左右的'.',的相连。从度为1的点作为突破口。
View Code
一个n*m的方格,'*'不能填。给你很多个1*2的尖括号,问你是否能用唯一填法填满方格。
类似topsort,'.'与上下左右的'.',的相连。从度为1的点作为突破口。
//#pragma comment(linker, "/STACK:102400000, 102400000") #include <algorithm> #include <iostream> #include <cstdlib> #include <cstring> #include <cstdio> #include <vector> #include <queue> #include <cmath> #include <ctime> #include <list> #include <set> #include <map> using namespace std; typedef long long LL; typedef pair <int, int> P; const int N = 2e3 + 5; int n, m, tx[] = {-1, 0, 1, 0}, ty[] = {0, -1, 0, 1}; char str ; int du[N*N]; vector <int> G[N*N]; inline bool judge(int x, int y) { if(x >= 0 && x < n && y >= 0 && y < m && str[x][y] == '.') return true; return false; } inline void get(int x, int y) { for(int i = 0 ; i < 4 ; ++i) { int xx = x + tx[i], yy = y + ty[i]; if(judge(xx, yy)) { G[x*m + y].push_back(xx*m + yy); du[x*m + y]++; } } } inline void change(int x, int y) { if(m == 1) { if(x < y) { str[x][0] = '^'; str[y][0] = 'v'; } else { str[x][0] = 'v'; str[y][0] = '^'; } } else { if(x - y == -m) { str[x/m][x%m] = '^'; str[y/m][y%m] = 'v'; } else if(x - y == m) { str[x/m][x%m] = 'v'; str[y/m][y%m] = '^'; } else if(x - y == -1) { str[x/m][x%m] = '<'; str[y/m][y%m] = '>'; } else { str[x/m][x%m] = '>'; str[y/m][y%m] = '<'; } } } int main() { int cnt = 0, op = 0; scanf("%d %d", &n, &m); for(int i = 0; i < n; ++i) { scanf("%s", str[i]); } for(int i = 0; i < n; ++i) { for(int j = 0; j < m; ++j) { if(judge(i, j)) { get(i, j); ++op; } } } queue <int> que; for(int i = 0; i < n*m; ++i) { if(du[i] == 1) que.push(i); } while(!que.empty()) { int u = que.front(); que.pop(); du[u]--; for(int i = 0; i < G[u].size(); ++i) { int v = G[u][i]; du[v]--; if(du[v] > 0) { cnt++; for(int j = 0; j < G[v].size(); ++j) { du[G[v][j]]--; if(du[G[v][j]] == 1) { que.push(G[v][j]); } } du[v] = 0; change(u, v); } else if(du[v] == 0) { cnt++; change(u, v); } } } if(cnt * 2 == op) { for(int i = 0; i < n; ++i) { printf("%s\n", str[i]); } } else { printf("Not unique\n"); } return 0; }
View Code
相关文章推荐
- CSS3属性transition
- Alarm(找规律)
- uva 1645 Count dp
- 二十二.完善Dashboard页面并更改font awesome icons
- 题目:输入两个链表,找出它们的第一个公共结点
- vector 简介
- [转]android解决apk编译方法数超过64k的问题
- 文件包含漏洞浅析
- kmp-KMP入门必做-匹配
- 浅析人脸检测之Haar分类器方法:Haar特征、积分图、 AdaBoost 、级联
- Android LocalBroadCastManager简介
- Codevs P1052 地鼠游戏
- Docker 1.12新功能探索(1):centos7上安装docker1.12
- one_day_one--cat
- linux下运行命令javac和java,多个依赖包的情况
- 越是孤独,就越是要坚持
- 一图秒懂P2P、P2C 、O2O 、B2C、B2B、C2C
- 第1章 错误处理
- 萤火虫之歌
- BZOJ1497 [NOI2006]最大获利