알고리즘/백준

백준 16918: 봄버맨 (Python)

sssbin 2023. 5. 2. 13:35

 

https://www.acmicpc.net/problem/16918

 

16918번: 봄버맨

첫째 줄에 R, C, N (1 ≤ R, C, N ≤ 200)이 주어진다. 둘째 줄부터 R개의 줄에 격자판의 초기 상태가 주어진다. 빈 칸은 '.'로, 폭탄은 'O'로 주어진다.

www.acmicpc.net

 

n=0일 때: 폭탄 설치

n=1일 때: 그대로

n=2일 때~: 나머지 모든 칸에 폭탄 설치 -> 폭발 반복

 

r*c 크기의 bombs 배열을 모두 0으로 초기화하고,

초기 상태 배열을 입력받으면서 'O'인 부분은 2로 바꿔준다. (0초 - 1초 상태)

 

i=2부터 n+1까지 for문을 돌려주면서

1. bombs 순회하면서 값을 하나씩 감소시키고,

2. i가 짝수일 때에는 모든 칸에 폭탄 설치 -> 0인 부분을 3으로 바꿔준다. (3초 후에 폭탄을 폭발시킬 것이기 때문)

    i가 홀수일 때에는 폭탄을 폭발시킨다. -> 0인 부분을 상하좌우 탐색하면서 폭발시킨다.

 

마지막에 0인 부분은 '.'으로 바꿔서, 아닌 부분은 'O'로 바꿔서 출력해주면 된다.

 

import copy

def explode(x, y, r, c):
    dx = [1, -1, 0, 0]
    dy = [0, 0, 1, -1]
  
    for i in range(4):
        mx = x + dx[i]
        my = y + dy[i]

        if mx < 0 or mx >= r or my < 0 or my >= c:
            continue

        temp[mx][my] = 0

r, c, n = map(int, input().split())

bombs = [[0] * c for _ in range(r)]
for i in range(r):
    temp = list(input())
    for j in range(c):
        if temp[j] == 'O':
            bombs[i][j] = 2

for i in range(2, n+1):
    for x in range(r): # 값 하나씩 감소
        for y in range(c):
            if bombs[x][y] != 0:
                bombs[x][y] -= 1

    if i % 2 == 0: # 모든 칸에 폭탄 설치
        for x in range(r):
            for y in range(c):
                if bombs[x][y] == 0:
                    bombs[x][y] = 3
    else: # 3초가 지난 폭탄 폭발
        temp = copy.deepcopy(bombs)
        for x in range(r):
            for y in range(c):
                if bombs[x][y] == 0:
                    explode(x, y, r, c)
        bombs = temp[:]

for i in range(r):
    for j in range(c):
        if bombs[i][j] == 0:
            bombs[i][j] = '.'
        else:
            bombs[i][j] = 'O'
        print(bombs[i][j], end='')
    print()

 

'알고리즘 > 백준' 카테고리의 다른 글

백준 21921: 블로그 (Python)  (0) 2023.06.15
백준 12933: 오리 (Python)  (0) 2023.04.14
백준 1766: 문제집 (Python)  (0) 2022.08.05
백준 2252: 줄 세우기 (Python)  (0) 2022.08.05
백준 2887: 행성 터널 (Python)  (0) 2022.08.04