【codeforces】515-D Drazil and Tiles
2015-02-23 21:37
239 查看
先建图,然后把度为1的全丢到队列里面,全跑一遍,没剩下的就可行。。。
#include <iostream> #include <queue> #include <stack> #include <map> #include <set> #include <bitset> #include <cstdio> #include <algorithm> #include <cstring> #include <climits> #include <cstdlib> #include <cmath> #include <time.h> #define maxn 2005 #define maxm 10005 #define eps 1e-7 #define mod 1000000007 #define INF 0x3f3f3f3f #define PI (acos(-1.0)) #define lowbit(x) (x&(-x)) #define mp make_pair #define ls o<<1 #define rs o<<1 | 1 #define lson o<<1, L, mid #define rson o<<1 | 1, mid+1, R #define pii pair<int, int> #pragma comment(linker, "/STACK:16777216") typedef long long LL; typedef unsigned long long ULL; //typedef int LL; using namespace std; LL qpow(LL a, LL b){LL res=1,base=a;while(b){if(b%2)res=res*base;base=base*base;b/=2;}return res;} LL powmod(LL a, LL b){LL res=1,base=a;while(b){if(b%2)res=res*base%mod;base=base*base%mod;b/=2;}return res;} // head char g[maxn][maxn]; int du[maxn * maxn]; queue<pair<int, int> > q; int n, m, cnt, res; inline int calc(int i, int j) { return i * m + j; } void read() { memset(g, '#', sizeof g); scanf("%d%d", &n, &m); for(int i = 0; i < n; i++) scanf("%s", g[i]); } void clear(int i, int j) { res++; du[calc(i, j)] = 0; if(g[i][j+1] == '.') { du[calc(i, j+1)]--; if(du[calc(i, j+1)] == 1) q.push(mp(i, j+1)); } if(g[i+1][j] == '.') { du[calc(i+1, j)]--; if(du[calc(i+1, j)] == 1) q.push(mp(i+1, j)); } if(i && g[i-1][j] == '.') { du[calc(i-1, j)]--; if(du[calc(i-1, j)] == 1) q.push(mp(i-1, j)); } if(j && g[i][j-1] == '.') { du[calc(i, j-1)]--; if(du[calc(i, j-1)] == 1) q.push(mp(i, j-1)); } } void work() { cnt = res = 0; for(int i = 0; i < n; i++) for(int j = 0; j < m; j++) if(g[i][j] == '.') { cnt++; if(g[i][j+1] == '.') du[calc(i, j)]++, du[calc(i, j+1)]++; if(g[i+1][j] == '.') du[calc(i, j)]++, du[calc(i+1, j)]++; if(du[calc(i, j)] == 1) q.push(mp(i, j)); } while(!q.empty()) { int i = q.front().first, j = q.front().second; q.pop(); if(g[i][j+1] == '.') clear(i, j+1), g[i][j] = '<', g[i][j+1] = '>'; if(g[i+1][j] == '.') clear(i+1, j), g[i][j] = '^', g[i+1][j] = 'v'; if(i && g[i-1][j] == '.') clear(i-1, j), g[i-1][j] = '^', g[i][j] = 'v'; if(j && g[i][j-1] == '.') clear(i, j-1), g[i][j-1] = '<', g[i][j] = '>'; } if(cnt == 2 * res) for(int i = 0; i < n; i++) printf("%s\n", g[i]); else printf("Not unique\n"); } int main() { read(); work(); return 0; }
相关文章推荐
- Drazil and Tiles(CodeForces 515D)
- Codeforces 515D - Drazil and Tiles (拓扑排序)
- 【codeforces 515D】Drazil and Tiles
- codeforces 515B B. Drazil and His Happy Friends(模拟)
- 【codeforces 516B】Drazil and Tiles
- 【codeforces 516B】Drazil and Tiles
- 【codeforces 515B】Drazil and His Happy Friends
- codeforces 515C. Drazil and Factorial
- CF_292_D_ Drazil and Tiles_贪心、dfs
- Drazil and Tiles - CODEFORCES 515D 贪心
- Codeforces Round #292 (Div. 1) B. Drazil and Tiles (类似拓扑)
- CodeForces - 515A Drazil and Date
- #292 (div.2) D.Drazil and Tiles
- codeforces#292-D. Drazil and Tiles-暴力/拓扑排序
- Codeforce 515 B . Drazil and His Happy Friends
- Codeforces Round #292 (Div. 1) B. Drazil and Tiles(拓扑排序)
- [Codeforces515D]Drazil and Tiles(构造)
- D. Drazil and Tiles (CF 515D bfs搜索)
- codeforces 515C C. Drazil and Factorial(水题,贪心)
- cf Round #292 (Div. 2)D. Drazil and Tiles 构造