728x90
시간 제한 2초, 메모리 제한 512MB
조건
- 크기가 R×C인 직사각형 격자판 위에서 살고 있다.
- 격자의 각 칸은 비어있거나 폭탄이 들어있다.
- 폭탄이 있는 칸은 3초가 지난 후에 폭발하고, 폭탄이 폭발한 이후에는 폭탄이 있던 칸이 파괴되어 빈 칸이 되며, 인접한 네 칸도 함께 파괴된다.
- 즉, 폭탄이 있던 칸이 (i, j)인 경우에 (i+1, j), (i-1, j), (i, j+1), (i, j-1)도 함께 파괴된다. 만약, 폭탄이 폭발했을 때, 인접한 칸에 폭탄이 있는 경우에는 인접한 폭탄은 폭발 없이 파괴된다.
- 따라서, 연쇄 반응은 없다.
- 봄버맨은 폭탄에 면역력을 가지고 있어서, 격자판의 모든 칸을 자유롭게 이동할 수 있다. 봄버맨은 다음과 같이 행동한다.
- 가장 처음에 봄버맨은 일부 칸에 폭탄을 설치해 놓는다. 모든 폭탄이 설치된 시간은 같다.
- 다음 1초 동안 봄버맨은 아무것도 하지 않는다.
- 다음 1초 동안 폭탄이 설치되어 있지 않은 모든 칸에 폭탄을 설치한다. 즉, 모든 칸은 폭탄을 가지고 있게 된다. 폭탄은 모두 동시에 설치했다고 가정한다.
- 1초가 지난 후에 3초 전에 설치된 폭탄이 모두 폭발한다.
- 3과 4를 반복한다.
폭탄을 설치해놓은 초기 상태가 주어졌을 때, N초가 흐른 후의 격자판 상태를 구하려고 한다.
입력
- 첫째 줄에 R, C, N (1 ≤ R, C, N ≤ 200)이 주어진다. 둘째 줄부터 R개의 줄에 격자판의 초기 상태가 주어진다.
- 빈 칸은 '
.
'로, 폭탄은 'O
'로 주어진다.
접근 방법
- 문제 그대로 풀어주면 될 것 같다.\
- 처음 1초는 아무일도 안하므로 -1
- 이후 while문 돌리면서 단계 별로 함수를 실행해주는데
- 함수를 실행한후 -1초를 해준다.
import sys
from collections import deque
# 1단계
def loc_bomb():
for i in range(r):
for j in range(c):
if graph[i][j] == 'O':
bomb.append((i, j))
# 3단계
def full_bomb():
for i in range(r):
for j in range(c):
if graph[i][j] != "O":
graph[i][j] = "O"
# 4단계
def bombs():
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
while bomb:
a, b = bomb.popleft()
graph[a][b] = "."
for i in range(4):
x = a + dx[i]
y = b + dy[i]
if 0 <= x < r and 0 <= y < c:
if graph[x][y] == "O":
graph[x][y] = "."
r, c, n = map(int, sys.stdin.readline().split())
# 1단계: 폭탄을 설치
graph = [list(map(str, sys.stdin.readline().strip())) for _ in range(r)]
# 2단계: 봄버맨은 아무것도 하지 않는다.
n -= 1
while n:
# 폭탄의 위치를 저장할 리스트
bomb = deque()
# 폭탄의 위치 저장
loc_bomb()
# 3단계: 모든 칸의 폭탄을 설치
full_bomb()
n -= 1
if n == 0:
break
# 4단계: 3초전에 설치된 폭탄 폭발
bombs()
n -= 1
for i in graph:
print("".join(i))
728x90
'ALGORITHM > 정렬, 탐색,구현' 카테고리의 다른 글
[백준 13335번] 파이썬 - 트럭 (0) | 2023.03.25 |
---|---|
[백준 10655번] 파이썬 - 마라톤1 (0) | 2023.03.23 |
[백준 14003번] 파이썬 - 가장 긴 증가하는 부분수열 5 (0) | 2023.03.18 |
[백준 13460번] 파이썬 - 구슬탈출2 (0) | 2023.03.16 |
[백준 14499번] 파이썬 - 주사위 굴리기 (0) | 2023.03.12 |