😎 κ³΅λΆ€ν•˜λŠ” μ§•μ§•μ•ŒνŒŒμΉ΄λŠ” μ²˜μŒμ΄μ§€?

[BAEKJOON python] 17142_μ—°κ΅¬μ†Œ 3 λ³Έλ¬Έ

πŸ¦₯ μ½”ν…Œ/BAEKJOON

[BAEKJOON python] 17142_μ—°κ΅¬μ†Œ 3

μ§•μ§•μ•ŒνŒŒμΉ΄ 2023. 4. 5. 23:29
728x90
λ°˜μ‘ν˜•
μ—°κ΅¬μ†Œ 3
λ°”μ΄λŸ¬μŠ€λŠ” ν™œμ„± μƒνƒœμ™€ λΉ„ν™œμ„± μƒνƒœ
κ°€μž₯ μ²˜μŒμ— λͺ¨λ“  λ°”μ΄λŸ¬μŠ€λŠ” λΉ„ν™œμ„± μƒνƒœ
ν™œμ„± μƒνƒœμΈ λ°”μ΄λŸ¬μŠ€λŠ” μƒν•˜μ’Œμš°λ‘œ μΈμ ‘ν•œ λͺ¨λ“  λΉˆ μΉΈμœΌλ‘œ λ™μ‹œμ— λ³΅μ œλ˜λ©°, 1μ΄ˆκ°€ κ±Έλ¦Ό
μ—°κ΅¬μ†Œμ˜ λ°”μ΄λŸ¬μŠ€ M개λ₯Ό ν™œμ„± μƒνƒœλ‘œ λ³€κ²½ν•˜λ €κ³  ν•¨
μ—°κ΅¬μ†ŒλŠ” ν¬κΈ°κ°€ N×N인 μ •μ‚¬κ°ν˜• (1×1 ν¬κΈ°μ˜ μ •μ‚¬κ°ν˜•μœΌλ‘œ λ‚˜λ‰¨)
μ—°κ΅¬μ†ŒλŠ” 0은 λΉˆ μΉΈ, 1은 λ²½, 2λŠ” λ°”μ΄λŸ¬μŠ€μ˜ μœ„μΉ˜
ν™œμ„± λ°”μ΄λŸ¬μŠ€κ°€ λΉ„ν™œμ„± λ°”μ΄λŸ¬μŠ€κ°€ μžˆλŠ” μΉΈμœΌλ‘œ κ°€λ©΄ λΉ„ν™œμ„± λ°”μ΄λŸ¬μŠ€κ°€ ν™œμ„±μœΌλ‘œ λ³€ν•¨

μ—°κ΅¬μ†Œμ˜ μƒνƒœκ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, λͺ¨λ“  λΉˆ μΉΈμ— λ°”μ΄λŸ¬μŠ€λ₯Ό νΌλœ¨λ¦¬λŠ” μ΅œμ†Œ μ‹œκ°„ κ΅¬ν•˜
λ°”μ΄λŸ¬μŠ€λ₯Ό μ–΄λ–»κ²Œ λ†“아도 λͺ¨λ“  λΉˆ μΉΈμ— λ°”μ΄λŸ¬μŠ€λ₯Ό νΌλœ¨λ¦΄ μˆ˜ μ—†λŠ” κ²½μš°μ—λŠ” -1을 μΆœλ ₯ν•œλ‹€.

첫째 μ€„에 μ—°κ΅¬μ†Œμ˜ ν¬κΈ° N(4 ≤ N ≤ 50), λ†“을 μˆ˜ μžˆλŠ” λ°”μ΄λŸ¬μŠ€μ˜ κ°œμˆ˜ M(1 ≤ M ≤ 10)
λ‘˜μ§Έ μ€„λΆ€ν„° N개의 μ€„에 μ—°κ΅¬μ†Œμ˜ μƒνƒœ
0은 λΉˆ μΉΈ, 1은 λ²½, 2λŠ” λ°”μ΄λŸ¬μŠ€ (M보닀 ν¬κ±°λ‚˜ κ°™κ³ , 10보닀 μž‘κ±°λ‚˜ κ°™μ€ μžμ—°μˆ˜)
from collections import deque
import copy

# μ—°κ΅¬μ†Œμ˜ 크기 N, 놓을 수 μžˆλŠ” λ°”μ΄λŸ¬μŠ€μ˜ 개수
n, m = map(int, input().split())
graph = []
virus = []
# μ΅œμ†Œ μ‹œκ°„
min_time = int(1e9)
# 뢁 동 남 μ„œ
dx = [1, 0, -1, 0]
dy = [0, 1, 0, -1]

for i in range(n):
    data = list(map(int, input().split()))
    graph.append(data)
    for j in range(n):
        if data[j] == 2:
            # λΉ„ν™œμ„±ν™” λ°”μ΄λŸ¬μŠ€
            graph[i][j] == -1
            # λ°”μ΄λŸ¬μŠ€ μœ„μΉ˜
            virus.append((i, j))


def check(g):
    for i in range(n):
        for j in range(n):
            # 빈 칸인가
            if g[i][j] == 0:
                return False
    return True


def combi(lst, num):
    result = []
    if num > len(lst):
        return result
    if num == 1:
        for l in lst:
            result.append([l])
    elif num > 1:
        for i in range(len(lst) - num + 1):
            for t in combi(lst[i + 1:], num - 1):
                result.append(t + [lst[i]])
    return result


def bfs(g, combination):
    global min_time
    visited = [[False] * n for _ in range(n)]
    queue = deque()
    if check(g):
        min_time = min(min_time, 0)
        return

    for c in combination:
        a, b = c
        visited[a][b] = True
        # ν™œμ„± λ°”μ΄λŸ¬μŠ€
        g[a][b] = -2
        # μœ„μΉ˜μ™€ κ±Έλ¦° μ‹œκ°„
        queue.append((a, b, 0))
    end_time = 0

    while queue:
        x, y, time = queue.popleft()
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            if 0 <= nx < n and 0 <= ny < n and not visited[nx][ny]:
                # 벽이면
                if g[nx][ny] == 1:
                    continue
                else:  # 빈칸이면
                    if g[nx][ny] == 0:
                        end_time = max(end_time, time + 1)
                    # ν™œμ„± λ°”μ΄λŸ¬μŠ€
                    g[nx][ny] = -2
                    visited[nx][ny] = True
                    queue.append((nx, ny, time + 1))
    if check(g):
        min_time = min(min_time, end_time)


g = copy.deepcopy(graph)
for com in combi(virus, m):
    g = copy.deepcopy(g)
    bfs(g, com)
    g = graph

if min_time == int(1e9):
    print(-1)
else:
    print(min_time)

예제 μž…λ ₯

7 3
2 0 0 0 1 1 0
0 0 1 0 1 2 0
0 1 1 0 1 0 0
0 1 0 0 0 0 0
0 0 0 2 0 1 1
0 1 0 0 0 0 0
2 1 0 0 0 0 2

예제 좜λ ₯

4

 

μ΄λ²ˆμ—λ„ λ„ˆλ¬΄ μ–΄λ ΅λ‹€..........

μ–Έμ œ λ‚˜ν˜Όμž ν•˜λ €λ‚˜........

κ°μ‚¬ν•©λ‹ˆλ‹€.

https://developer-ellen.tistory.com/62

728x90
λ°˜μ‘ν˜•
Comments