시작하는 중
백준 - 봄버맨 본문
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)
'알고리즘 > 백준' 카테고리의 다른 글
백준 - 수 이어 쓰기 2 (0) | 2023.03.02 |
---|---|
[파이썬] 백준 13023 - ABCDE (1) | 2022.10.05 |
[파이썬] 백준 17472 - 다리 만들기 2 (0) | 2022.09.27 |
백준 9020번 : 골드바흐의 추측 - 파이썬 (0) | 2022.04.20 |
[파이썬] 백준 4948번 : 베르트랑 공준 (0) | 2022.04.20 |