본문 바로가기

알고리즘/백준 (Pyhthon)

[알고리즘] 백준 16918 봄버맨 / 파이썬

www.acmicpc.net/problem/16918

 

16918번: 봄버맨

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

www.acmicpc.net

 

풀이 방법

폭탄을 설치할 때, 현재 몇 초인지도 같이 저장한다

그리고 폭탄을 터트릴 때 같이 저장했던 시간이 3초 뒤라면 터트린다

# pypy 제출

def fill(num):
    for i in range(R):
        for j in range(C):
            if Map[i][j][0] == '.':
                Map[i][j][0], Map[i][j][1] = 'O', num

dx, dy = [0, -1, 0, 1, 0], [0, 0, -1, 0, 1]
def boom(num):
    lst = []
    for i in range(R):
        for j in range(C):
            if Map[i][j][0] == 'O' and num == Map[i][j][1] + 3:
                for k in range(5):
                    if 0 <= i+dx[k] < R and 0 <= j+dy[k] < C:
                        lst.append([i+dx[k], j+dy[k]])
    for x, y in lst:
        Map[x][y][0], Map[x][y][1] = '.', -9

def sol(num):
    if num > N:
        for i in range(R):
            temp = ''
            for j in range(C):
                temp += Map[i][j][0]
            print(temp)
        return
    if num % 2 == 0:
        fill(num)
        sol(num + 1)
    else:
        boom(num)
        sol(num + 1)

R, C, N = map(int, input().split(' '))
Map = []
for i in range(R):
    temp = []
    for j in input():
        if j == 'O':
            temp.append(['O', 0])
        else:
            temp.append(['.', -9])
    Map.append(temp)
sol(2)

 

다른 풀이

이전 배열, 새로운 배열을 계속 갱신해줌

이전 배열은 폭탄으로 파괴할 때 이용하고, 새로운 배열은 무조건 전체가 O로 채워진다

R, C, N = map(int, input().split())
A, old = [list(input()) for _ in range(R)], []
dx, dy = [0, 1, 0, -1], [1, 0, -1, 0]

def full():
    return [['O' for _ in range(C)] for _ in range(R)]

def bomb(A, old):
    for i in range(R):
        for j in range(C):
            if old[i][j] == '.' :
                continue
            A[i][j] = '.'
            for x in range(4):
                ii, jj = i + dx[x], j + dy[x]
                if not (0 <= ii < R and 0 <= jj < C) :
                    continue
                A[ii][jj] = '.'
    return A

def tictoc(t):
    global A, old
    if t%2:
        A, old = bomb(A, old), A[:]
    else:
        A, old = full(), A[:]
    
for i in range(N-1):
    tictoc(i)

print('\n'.join([''.join(r) for r in A]))