시작하는 중

백준 - 봄버맨 본문

알고리즘/백준

백준 - 봄버맨

싱욱 2023. 3. 1. 22:48

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

 

16918번: 봄버맨

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

www.acmicpc.net

탐색 문제

 

탐색하다가 터질 폭탄만 스택에 넣고 터지는 연산을 한번에 해주면 된다.

바로 갱신 해버리면 값이 갱신되서 터질 폭탄도 다른 폭탄에 의해 없는 폭탄 취급해버리기 때문이다.

 

1. 모든 초마다 전부 탐색하면서 0이면 심어주고 1,2면 1씩 증가, 3이면 터뜨릴 스택에 넣어주고

2. 터뜨릴 스택이 존재한다면 전부 터뜨려주기

 

처음 1초는 아무것도 안한다고 했어서 처음에 2 상태로 시작하고 탐색도 2초가 되는 차례부터 시작했다.

 

import sys
def input():
    return sys.stdin.readline().rstrip()

Y, X, N = map(int,input().split())

# 붐버맨의 맵 만들기
boomber_map = []
for i in range(Y):
    x_input_list = list(input())
    for x in range(X):
        if x_input_list[x] == "O":
            x_input_list[x] = 2
        else:
            x_input_list[x] = 0
    boomber_map.append(x_input_list)

# 횟수를 셀 변수
cnt = 1

# 유효 범위 체크 함수
def range_checker(y,x):
    if 0 <= y < Y and 0 <= x < X:
        return True
    else:
        return False

d = [[0,-1],[0,1],[-1,0],[1,0]]

# 터뜨릴 좌표를 담을 스택
boom_position_stk = []

while cnt < N:
    for y in range(Y):
        for x in range(X):
            if not boomber_map[y][x]:
                boomber_map[y][x] = 1
            elif boomber_map[y][x] == 1:
                boomber_map[y][x] = 2
            elif boomber_map[y][x] == 2:
                boomber_map[y][x] = 3
            elif boomber_map[y][x] == 3:
                boom_position_stk.append((y,x))
                for dy, dx in d:
                    ny = y + dy
                    nx = x + dx
                    if range_checker(ny, nx):
                        boom_position_stk.append((ny,nx))
    while boom_position_stk:
        y,x = boom_position_stk.pop()
        boomber_map[y][x] = 0
    cnt += 1

# 출력
for boomber_x in boomber_map:
    value_to_print = ''
    for boomber_x_ele in boomber_x:
        if not boomber_x_ele:
            value_to_print += '.'
        else:
            value_to_print += 'O'
    print(value_to_print)