메모리 31408KB, 시간 2900 ms
처음에 bfs로 풀려고 했는데, 어떻게 하다보니 다른 방식으로 풀게 되었다.
내가 포인트로 잡은 것은
- 1초 일 때는 입력된 그래프 그대로 출력
- 2초 이상의 짝수 시간일때는 모두 'O'출력
- 3초 이상의 홀수 시간일때는
a. graph에서 'O'의 상하좌우위치에 res을 True로 만들기
( 폭탄이 터진 후 '.'으로 표시 될 부분을 체크)
그 후에 res가 True일때 graph를 '.'를 바꾼다.
b. res가 False일때 (새롭게 폭탄이 설치될 부분) graph를 'O'로 바꾼다.
즉, 설치&폭발을 한 번에 처리했다.(2초 뒤)
c. res를 반전시킨다.
r, c, n = map(int, input().split())
graph = [list(input()) for _ in range(r)]
res = [[True if graph[i][j] == 'O' else False for j in range(c)] for i in range(r)]
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
s = 3
def bfs(x, y):
for i in range(4):
nx, ny = x + dx[i], y + dy[i]
if nx < 0 or ny < 0 or nx >= r or ny >= c:
continue
res[nx][ny] = True
while s <= n:
for i in range(r):
for j in range(c):
if graph[i][j] == 'O':
bfs(i, j)
for i in range(r):
for j in range(c):
if res[i][j]:
graph[i][j] = '.'
else:
graph[i][j] = 'O'
res[i][j] = not res[i][j]
s += 2
for i in range(r):
for j in range(c):
if n % 2 == 0:
print('O', end='')
else:
print(graph[i][j], end='')
if i < r-1: print()