AGC 033 A - Darker and Darker
今日はやらない予定だったんですけど、昨日のが不完全燃焼だったの思い出して悶々としてしまったので。
続きです。
リンクです。
問題概要
H*Wのマスに白マス'.'と黒マス'#'がある。1ターンで、黒マスを中心とする十字に塗り潰すことができる。何ターンで全てのマスが黒マスになるか。
考えたこと(間違い)
最初に、黒マスを取得し、1 ターンごと塗りつぶすマスをキューにぶち込んで黒くする。キューが空になるまで繰り返す。
TLEで死んだ。
""" TLE """ from collections import deque def main(): h, w = [int(i) for i in input().split()] f = [] black = deque() for i in range(h): line = list(input()) for j, c in enumerate(line): if c == '#': black.appendleft((i, j)) f.append(line) ans = 0 d = [[False for i in range(w)] for j in range(h)] black.appendleft((-1, -1)) sw = False while black: y, x = black.pop() if (y, x) == (-1, -1) and sw: break else: sw = False if (y, x) == (-1, -1): sw = True ans += 1 black.appendleft((-1, -1)) for dy, dx in [(-1, 0), (1, 0), (0, -1), (0, 1)]: if 0 <= y+dy < h and 0 <= x+dx < w and f[y+dy][x+dx] == '.' and \ d[y+dy][x+dx] == False: f[y+dy][x+dx] = '#' d[y+dy][x+dx] = True black.appendleft((y+dy, x+dx)) print(ans-1) if __name__ == '__main__': main()
別マップを用意して、訪れたか確認してたんだけど、どうしてもダメだった。ターンごとのマスを識別するために(-1, -1)の組みを入れたんだけど、全然だった。
けんちょんさんのC++コードを書き直してもTLE。 こんな感じ
from collections import deque def main(): h, w = [int(i) for i in input().split()] f = [] for i in range(h): f.append(list(input())) #カウンター用のフィールド d = [[-1 for j in range(w)] for i in range(h)] q = deque() for i in range(h): for j in range(w): if f[i][j] == '#': # スタート地点のメモ d[i][j] = 0 q.appendleft((i, j)) while q: y, x = q.pop() for dy, dx in [(-1, 0), (1, 0), (0, -1), (0, 1)]: ny, nx = y+dy, x+dx # 行ったことない場合に限る if 0 <= ny < h and 0 <= nx < w and d[ny][nx] == -1: d[ny][nx] = d[y][x] + 1 q.appendleft((ny, nx)) ans = 0 for i in range(h): for j in range(w): ans = max(ans, d[i][j]) print(ans) if __name__ == '__main__': main()
けんちょんさんのは、別マップにターン数を書いて保存したやつで、自分とは考えが違かったんだな、なるほどなと思った。ちなみに、TLEだったけど、けんちょんさんのは、TLEが 1 つ減ったりして、勉強になった。 TLEが取れなくて、こんな日もあるんでしょうという気持ちになった日でした。
あ、今日は vue と OS の記事書きません。