๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm/๋ฐฑ์ค€

[๋ฐฑ์ค€] 16985 Maaaaaaaaaze(ํŒŒ์ด์ฌ/python)

by chjcoder 2023. 8. 16.

๐ŸŽˆ๋ฌธ์ œ

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

 

๐ŸŽ์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜?

1.์ž…๋ ฅ๋ฐ›๊ธฐ
2. ์ธต ๋ณ„๋กœ permuation(์ˆœ์—ด) ์ฐพ๊ธฐ
3. ํšŒ์ „ -> 90๋„์”ฉ ๋ฐ˜๋ณต
4. ํƒ์ƒ‰ -> bfs
5. ์ตœ์†Œ ํšŸ์ˆ˜ -> bfs๋Œ๋ฆฐ ๊ฒฐ๊ณผ ๋‚˜์˜ฌ ๋•Œ ๋งˆ๋‹ค ์ž‘์€์ˆ˜ ์—…๋ฐ์ดํŠธ

 

# ๋‹ค ํ’€๊ณ  ์ œ์ถœํ•˜๋‹ˆ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋– ์„œ ๋‹นํ™ฉํ–ˆ๋‹ค. ๋ฐ‘์— ์ฝ”๋“œ์— # ์‹œ๊ฐ„ ๋‹จ์ถ• ์ด๋ผ๊ณ  ์ฃผ์„์„ ๋‹ฌ์•„๋†“์€ ์ฝ”๋“œ๋Š” ์‹œ๊ฐ„์ดˆ๊ณผ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์ฝ”๋“œ์ด๋‹ค.

๐Ÿ’ป์ฝ”๋“œ

# 16985 Maaaaaaaaaze
'''
1.์ž…๋ ฅ๋ฐ›๊ธฐ
2. ์ธต ๋ณ„๋กœ permuation(์ˆœ์—ด) ์ฐพ๊ธฐ
3. ํšŒ์ „ -> 90๋„์”ฉ ๋ฐ˜๋ณต
4. ํƒ์ƒ‰ -> bfs
5. ์ตœ์†Œ ํšŸ์ˆ˜ -> bfs๋Œ๋ฆฐ ๊ฒฐ๊ณผ ๋‚˜์˜ฌ ๋•Œ ๋งˆ๋‹ค ์ž‘์€์ˆ˜ ์—…๋ฐ์ดํŠธ
'''

from itertools import permutations
from collections import deque
from copy import deepcopy

def Search():
    global cnt
    for _ in range(4):
        for _ in range(4):
            for _ in range(4):
                for _ in range(4):
                    for _ in range(4):
                        Rotation(4) # 90๋„ ํšŒ์ „
                        cnt = min(cnt,Bfs(temp_graph))  # bfs๋กœ ํ˜„์žฌ ๊ทธ๋ž˜ํ”„์—์„œ์˜ ์ตœ์†Œ ํšŸ์ˆ˜ ํƒ์ƒ‰
                        if cnt == 12:   # ์‹œ๊ฐ„ ๋‹จ์ถ•
                            return
                    Rotation(3)
                Rotation(2)
            Rotation(1)
        Rotation(0)
    return

def Maaaaaaaaaze():
    for c in permutations(range(5)):
        for i in range(5):
            temp_graph[i] = graph[c[i]] # ๊ฒฝ์šฐ์˜ ์ˆ˜
        Search()    # cnt return


# ๊ทธ๋ž˜ํ”„ 90๋„ ํšŒ์ „
def Rotation(n):
    temp = [[0 for j in range(5)] for i in range(5)]
    for i in range(5):
        for j in range(5):
            temp[i][j] = temp_graph[n][4-j][i]
    temp_graph[n] = temp
    return

# bfs๋กœ ์ตœ์†Œ ํšŸ์ˆ˜ ํƒ์ƒ‰
def Bfs(graph):
    if graph[0][0][0] == 0 or graph[4][4][4] == 0: # ์‹œ์ž‘์ด๋‚˜ ๋์ด ๋ง‰ํ˜€์žˆ์œผ๋ฉด ํƒˆ์ถœ ๋ถˆ๊ฐ€
        return 126
    deq = deque()
    deq.append([0,0,0])
    visit = [[[-1,-1,-1,-1,-1] for j in range(5)] for i in range(5)]

    visit[0][0][0] = 0  # ์‹œ์ž‘์ 
    dx = [0,0,1,-1,0,0]
    dy = [1,-1,0,0,0,0]
    dz = [0,0,0,0,1,-1]

    while deq:
        z,x,y = deq.popleft()
        if z == 4 and x == 4 and y == 4:    #์ถœ๊ตฌ ๋„์ฐฉ
            return visit[z][x][y]

        if visit[z][x][y] > cnt:    # ์‹œ๊ฐ„ ๋‹จ์ถ•(ํ˜„์žฌ ํƒ์ƒ‰์ค‘์ธ๊ฒŒ ํ˜„์žฌcnt๊ฐ’ ๋ณด๋‹ค ๋†’์•„์ง€๋ฉด ์ค‘๋‹จ)
            return visit[z][x][y]

        for i in range(6):
            nx = x + dx[i]
            ny = y + dy[i]
            nz = z + dz[i]

            if nx < 0 or nx > 4 or ny < 0 or ny > 4 or nz < 0 or nz > 4:
                continue
            if graph[nz][nx][ny] == 1 and visit[nz][nx][ny] == -1:
                visit[nz][nx][ny] = visit[z][x][y] + 1
                deq.append([nz,nx,ny])
    # ์ถœ๊ตฌ ๋„๋‹ฌ ๋ชปํ•˜๋ฉด
    return 126

# 1. ์ž…๋ ฅ ๋ฐ›๊ธฐ
graph = [[list(map(int,input().split())) for j in range(5)]for i in range(5)]
temp_graph = [[[0,0,0,0,0]for j in range(5)]for i in range(5)]
cnt = 126

Maaaaaaaaaze()
if cnt == 126:
    print(-1)
else:
    print(cnt)

๐ŸŽ„์ฝ”๋“œ ์„ค๋ช…

์ฃผ์„์œผ๋กœ ๋Œ€์ฒด ํ•ฉ๋‹ˆ๋‹ค.