ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

728x90
๋ฐ˜์‘ํ˜•

์—ฐ๊ตฌ์†Œ ์‹œ๋ฆฌ์ฆˆ

 

๋ฌธ์ œ

 

17142๋ฒˆ: ์—ฐ๊ตฌ์†Œ 3

์ธ์ฒด์— ์น˜๋ช…์ ์ธ ๋ฐ”์ด๋Ÿฌ์Šค๋ฅผ ์—ฐ๊ตฌํ•˜๋˜ ์—ฐ๊ตฌ์†Œ์— ์Šน์›์ด๊ฐ€ ์นจ์ž…ํ–ˆ๊ณ , ๋ฐ”์ด๋Ÿฌ์Šค๋ฅผ ์œ ์ถœํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ๋ฐ”์ด๋Ÿฌ์Šค๋Š” ํ™œ์„ฑ ์ƒํƒœ์™€ ๋น„ํ™œ์„ฑ ์ƒํƒœ๊ฐ€ ์žˆ๋‹ค. ๊ฐ€์žฅ ์ฒ˜์Œ์— ๋ชจ๋“  ๋ฐ”์ด๋Ÿฌ์Šค๋Š” ๋น„ํ™œ์„ฑ ์ƒํƒœ์ด๊ณ 

www.acmicpc.net

 

๋ฌธ์ œ ํ’€์ด

 ์•ž์„œ ๋‹ค๋ฃฌ ์—ฐ๊ตฌ์†Œ 2 ๋ฌธ์ œ์—์„œ ์กฐ๊ฑด์ด ์กฐ๊ธˆ ๋‹ฌ๋ผ์ง„ ๋ฌธ์ œ์ด๋‹ค. ์—ฐ๊ตฌ์†Œ 2์—์„œ๋Š” ๋ฐ”์ด๋Ÿฌ์Šค๋ฅผ ์„ค์น˜ํ•˜๊ณ , ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ์„ค์น˜๊ฐ€๋Šฅํ•œ ์œ„์น˜์ด์ง€๋งŒ ์„ค์น˜๋˜์–ด์žˆ์ง€ ์•Š์„ ๊ฒฝ์šฐ ํ•ด๋‹น ์˜์—ญ์—๋„ ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ์ „ํŒŒ ๊ฐ€๋Šฅํ•˜๋‹ค. ํ•˜์ง€๋งŒ ์ด ๋ฌธ์ œ์—์„œ๋Š” ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ์„ค์น˜ ๊ฐ€๋Šฅํ•œ ์œ„์น˜์— ๋ชจ๋‘ ์„ค์น˜๋˜์–ด ์žˆ๊ณ , `ํ™œ์„ฑํ™”`, `๋น„ํ™œ์„ฑํ™”` ์ƒํƒœ๋กœ ๋‚˜๋‰˜๊ฒŒ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ฏธ ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ์„ค์น˜๋œ ๊ณณ์ด๋ฏ€๋กœ ์ „ํŒŒ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜์—ฌ `๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ์žˆ๋Š” ์œ„์น˜๋ฅผ ์ œ์™ธ์‹œ์ผœ์•ผ ํ•œ๋‹ค๋Š” ์ฐจ์ด์ `์ด ์žˆ๋‹ค. ๋˜ํ•œ, `๋ฐ”์ด๋Ÿฌ์Šค๋ฅผ ์ „ํŒŒํ•˜์—ฌ์•ผ ํ•˜๋Š” ์ˆ˜๋Š” 0์˜ ๊ฐœ์ˆ˜์™€ ๊ฐ™์•„์ง„๋‹ค๋Š” ์ฐจ์ด์ `๋„ ์žˆ๋‹ค.

 

์ฝ”๋“œ

from sys import stdin
from collections import deque
from itertools import combinations
from math import inf


def visitable(x, y, visited):
    return 0 <= x < n and 0 <= y < n and graph[x][y] != 1 and not visited[x][y]


def bfs(infect, start):
    q = deque(start)
    dirs = ((0, 1), (0, -1), (1, 0), (-1, 0))
    visited = [[False] * n for _ in range(n)]
    cur_time, cur_infect = 0, 0

    # ์ดˆ๊ธฐ ๋ฐ”์ด๋Ÿฌ์Šค ํ™œ์„ฑํ™” ์ง€์  ๋ฐฉ๋ฌธ ํ‘œ์‹œ.
    for x, y, _ in q:
        visited[x][y] = True

    while q:
        x, y, time = q.popleft()
        for dx, dy in dirs:
            next_x, next_y = x + dx, y + dy
            if visitable(next_x, next_y, visited):
                visited[next_x][next_y] = True
                if graph[next_x][next_y] == 0:
                    # ์„ค์น˜๋œ ๋ฐ”์ด๋Ÿฌ์Šค๋Š” ์ œ์™ธํ•˜๊ธฐ ์œ„ํ•จ.
                    cur_time = time + 1
                    cur_infect += 1
                q.append((next_x, next_y, time + 1))

    return cur_time if cur_infect == infect else answer


def find_loc():
    global zero, virus
    loc = []
    for i in range(n):
        for j in range(n):
            if graph[i][j] == 2:
                loc.append([i, j, 0])
            if graph[i][j] == 0:
                zero += 1
    return combinations(loc, m)


if __name__ == '__main__':
    n, m = map(int, stdin.readline().split())
    graph = [list(map(int, stdin.readline().split())) for _ in range(n)]
    zero, answer = 0, inf
    
    for candi in find_loc():
        answer = min(answer, bfs(zero, candi))
    print(answer if answer != inf else -1)

 

728x90
๋ฐ˜์‘ํ˜•
๋Œ“๊ธ€
๊ธ€ ๋ณด๊ด€ํ•จ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€