結果
| 問題 |
No.1434 Make Maze
|
| コンテスト | |
| ユーザー |
tamato
|
| 提出日時 | 2021-03-19 22:48:30 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
RE
|
| 実行時間 | - |
| コード長 | 4,445 bytes |
| コンパイル時間 | 162 ms |
| コンパイル使用メモリ | 82,660 KB |
| 実行使用メモリ | 88,888 KB |
| 最終ジャッジ日時 | 2024-11-19 00:08:53 |
| 合計ジャッジ時間 | 6,742 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 28 RE * 2 |
ソースコード
mod = 1000000007
eps = 10 ** -9
def main():
import sys
input = sys.stdin.readline
class UnionFind():
def __init__(self, n):
self.n = n
self.root = [-1] * (n + 1)
self.rnk = [0] * (n + 1)
def find_root(self, x):
while self.root[x] >= 0:
x = self.root[x]
return x
def unite(self, x, y):
x = self.find_root(x)
y = self.find_root(y)
if x == y:
return
elif self.rnk[x] > self.rnk[y]:
self.root[x] += self.root[y]
self.root[y] = x
else:
self.root[y] += self.root[x]
self.root[x] = y
if self.rnk[x] == self.rnk[y]:
self.rnk[y] += 1
def isSameGroup(self, x, y):
return self.find_root(x) == self.find_root(y)
def size(self, x):
return -self.root[self.find_root(x)]
def fin():
print(-1)
exit()
def unite(h1, w1, h2, w2):
if w1 == w2:
grid[(h1 + h2) // 2][w1] = "."
else:
grid[h1][(w1 + w2) // 2] = "."
def cut(h1, w1, h2, w2):
if w1 == w2:
grid[(h1 + h2) // 2][w1] = "#"
else:
grid[h1][(w1 + w2) // 2] = "#"
H, W, X = map(int, input().split())
grid = [["#"] * W for _ in range(H)]
for h in range(H):
for w in range(W):
if h%2 == 0 and w%2 == 0:
grid[h][w] = "."
if X & 1:
fin()
H2 = H // 2 + 1
W2 = W // 2 + 1
X_max = (H2 * W2 - 1) * 2
if H2 % 2 == 0 and W2 % 2 == 0:
if X > X_max - 2:
fin()
else:
if X > X_max:
fin()
if X < (H2 - 1 + W2 - 1) * 2:
fin()
if ((H2 - 1) + (W2 - 1))%2 == 0:
if (X // 2) & 1:
fin()
else:
if (X // 2) % 2 == 0:
fin()
for w in range(W-2):
if w%2 == 0:
unite(0, w, 0, w+2)
X -= 2
for h in range(H-2):
if h%2 == 0:
unite(h, W-1, h+2, W-1)
X -= 2
if H2 & 1:
ww = W-1
hh = 2
while X:
X -= 4
unite(hh, ww, hh, ww-2)
unite(hh+2, ww, hh+2, ww-2)
unite(hh, ww-2, hh+2, ww-2)
cut(hh, ww, hh+2, ww)
ww -= 2
if ww == 0:
ww = W-1
hh += 4
elif W2 & 1:
hh = 0
ww = 0
while X:
X -= 4
unite(hh, ww, hh+2, ww)
unite(hh, ww+2, hh + 2, ww + 2)
unite(hh+2, ww, hh+2, ww+2)
cut(hh, ww, hh, ww+2)
hh += 2
if hh == H-1:
hh = 0
ww += 4
else:
ww = W - 1
hh = 2
while X:
X -= 4
unite(hh, ww, hh, ww - 2)
unite(hh + 2, ww, hh + 2, ww - 2)
unite(hh, ww-2, hh+2, ww-2)
cut(hh, ww, hh + 2, ww)
ww -= 2
if ww == 0:
ww = W - 1
hh += 4
if hh > H-1:
break
ww = 0
while X:
X -= 4
unite(H-3, ww, H-1, ww)
unite(H-3, ww+2, H-1, ww+2)
unite(H-3, ww, H-3, ww+2)
cut(H-1, ww, H-1, ww+2)
ww += 4
UF = UnionFind(H2 * W2)
for hh in range(H2):
for ww in range(W2):
hw = hh * W2 + ww + 1
hw_new_h = hw + W2
if hh != H2-1:
if grid[hh * 2 + 1][ww * 2] == ".":
UF.unite(hw, hw_new_h)
hw_new_w = hw + 1
if ww != W2-1:
if grid[hh * 2][ww * 2 + 1] == ".":
UF.unite(hw, hw_new_w)
for hh in range(H2):
for ww in range(W2):
hw = hh * W2 + ww + 1
hw_new_h = hw + W2
if hh != H2 - 1:
if not UF.isSameGroup(hw, hw_new_h):
grid[hh * 2 + 1][ww * 2] = "."
UF.unite(hw, hw_new_h)
hw_new_w = hw + 1
if ww != W2 - 1:
if not UF.isSameGroup(hw, hw_new_w):
grid[hh * 2][ww * 2 + 1] = "."
UF.unite(hw, hw_new_w)
for h in range(H):
print("".join(grid[h]))
if __name__ == '__main__':
main()
tamato