cf515 D. Drazil and Tiles
阿新 • • 發佈:2022-03-27
題意:
由 .
和 *
組成的矩陣,每次可以染相鄰兩格,要對所有 .
染色,且不能重複染色。問是否存在唯一的染色方案。
思路:
定義一個 .
點的度為相鄰的 .
數量。每次取一個度為1的 .
和它的相鄰未染色 .
進行染色,類似拓撲排序。最後看有沒有染完。
const signed N = 2003; int n, m, res, d[N][N]; char g[N][N]; int dx[] = {0,0,1,-1}, dy[] = {1,-1,0,0}; signed main() { iofast; cin >> n >> m; for(int i = 1; i <= n; i++) cin >> g[i] + 1; res = n * m; for(int i = 1; i <= n; i++) for(int j = 1; j <= m; j++) if(g[i][j] == '.') for(int k = 0; k < 4; k++) d[i][j] += g[i+dx[k]][j+dy[k]]=='.'; else res--; queue<PII> q; for(int i = 1; i <= n; i++) for(int j = 1; j <= m; j++) if(d[i][j] == 1) q.push({i,j}); while(q.size()) { auto [x,y] = q.front(); q.pop(); if(g[x][y] != '.') continue; for(int i = 0; i < 4; i++) { int xx = x + dx[i], yy = y + dy[i]; if(g[xx][yy] == '.') { res -= 2; d[x][y]--, d[xx][yy]--; if(i == 0) g[x][y] = '<', g[xx][yy] = '>'; if(i == 1) g[x][y] = '>', g[xx][yy] = '<'; if(i == 2) g[x][y] = '^', g[xx][yy] = 'v'; if(i == 3) g[x][y] = 'v', g[xx][yy] = '^'; for(int j = 0; j < 4; j++) { int xxx = xx + dx[j], yyy = yy + dy[j]; if(g[xxx][yyy] == '.' && --d[xxx][yyy] == 1) q.push({xxx,yyy}); } } } } if(res) cout << "Not unique"; else for(int i = 1; i <= n; i++) cout << g[i] + 1 << endl; }