백준 16918 봄버맨

wook2·2022년 11월 3일
0

알고리즘

목록 보기
109/117

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

시뮬레이션 문제이다.

폭탄이 같이 터진다는 점에서
배열을 0,0부터 r,c까지 순차적으로 탐색했을때, 폭탄이 터진 경우 옆에 있는 폭탄도 터트리면 안된다.

그렇기 때문에 폭탄이 터지지 않는 위치에서 주변에 터지는 폭탄이 없다면 그 상태 그대로 있고, 아니라면 터진 위치로 마킹해준다.

def simulate(n):
    while n > 0:
        set_bomb()
        n -= 1
        if n == 0:
            return
        burst()
        n -= 1
        if n == 0:
            return
    return

def burst():
    dx = [-1,0,1,0]
    dy = [0,1,0,-1]
    temp = []
    for i in range(r):
        for j in range(c):
            if time[i][j] == 1:
                array[i][j] = '.'
                temp.append((i,j))
                continue
            for k in range(4):
                nx = i + dx[k]
                ny = j + dy[k]
                if 0 <= nx < r and 0 <= ny < c:
                    if time[nx][ny] == 1:
                        array[i][j] = '.'
                        time[i][j] = 0
    for location in temp:
        x,y = location
        time[x][y] = 0


def set_bomb():
    for i in range(r):
        for j in range(c):
            if array[i][j] == '.':
                time[i][j] = 2
                array[i][j] = 'O'
            elif array[i][j] == 'O':
                time[i][j] -= 1

r,c,n = list(map(int,input().split()))
array = []
for i in range(r):
    array.append(list(input()))

time = [[0]*c for i in range(r)]
for i in range(r):
    for j in range(c):
        if array[i][j] == 'O':
            time[i][j] = 2

n -= 1
simulate(n)
for i in range(r):
    for j in range(c):
        print(array[i][j],end='')
    print()
profile
꾸준히 공부하자

0개의 댓글