Python/백준

14502_연구소

728x90

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

 

14502번: 연구소

인체에 치명적인 바이러스를 연구하던 연구소에서 바이러스가 유출되었다. 다행히 바이러스는 아직 퍼지지 않았고, 바이러스의 확산을 막기 위해서 연구소에 벽을 세우려고 한다. 연구소는 크

www.acmicpc.net

 

 

 

벽을 세운 후에 미로를 풀면 된다.

 

바이러스를 퍼뜨리는것을 함수로 만들어서 dfs로 구현하였다.

 

그후 바이러스가 있다면 주위로 퍼져나가게끔 2차원 배열 전체에서 dfs를 한번씩 실행한 후에, 나온 보드에서 0의 개수를 세주며 업데이트를 해준다.

 

벽을 3개 세워줘야 하는데, 중요한건 꼭 3개가 채워져야 한다는 것 즉, 전체 배열 중에서 3개를 순열로 뽑아내서 m으로 나눈후 몫을 x좌표, 나머지를 y좌표로 삼아 3개가 채울수 있는경우에만 전체적으로 dfs를 설정해주었다.

 

나는 board 를 전역변수로 설정해두었기에, 초기상태 지도를 저장할 old_board를 만들어둬서 dfs를 돌릴때마다 갱신하도록 해 주었다.

 

import sys
from itertools import combinations
input = sys.stdin.readline

n,m = map(int,input().split())
board = [ list(map(int,input().split())) for _ in range(n) ]

dx = [ 0,1,0,-1 ]
dy = [ 1,0,-1,0 ]


def dfs(x,y):
    if board[x][y] !=2:
        return

    for i in range(4):
        nx,ny = x + dx[i],y+dy[i]
        if 0<=nx<n and 0<=ny<m and not board[nx][ny]:
            board[nx][ny] = 2
            dfs(nx,ny)

def check_dfs():
    for i in range(n):
        for j in range(m):
            dfs(i,j)

    cnt = 0
    for i in board:
        for j in i:
            if j == 0:
                cnt +=1
    return cnt

old_board = [ x[:] for x in  board ]
result = 0
for combi in combinations(range(n*m),3):

    tmp = []
    for i in combi:
        tmp.append([i//m,i%m])


    board = [ x[:] for x in old_board]

    for x,y in tmp:
        if board[x][y] != 0:
            break
        board[x][y] = 1
    else:
        result = max(result,check_dfs())

print(result)
728x90

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

14890_경사로  (0) 2022.06.27
14503_로봇청소기  (0) 2022.06.27
14499_주사위굴리기  (0) 2022.06.24
3190_뱀  (0) 2022.06.20
12100_2048(easy)  (0) 2022.06.19