-
백준 16985 - Maaaaaaaaaze (Python)BOJ PS/Python 2023. 7. 10. 22:16
https://acmicpc.net/problem/16985
16985번: Maaaaaaaaaze
첫째 줄부터 25줄에 걸쳐 판이 주어진다. 각 판은 5줄에 걸쳐 주어지며 각 줄에는 5개의 숫자가 빈칸을 사이에 두고 주어진다. 0은 참가자가 들어갈 수 없는 칸, 1은 참가자가 들어갈 수 있는 칸을
www.acmicpc.net
재미있는 문제였다. 말 그대로 브루트포스의 정석.
시키는 대로 하나하나 층을 살펴보면 된다.import sys from collections import deque from itertools import permutations input=sys.stdin.readline def rotate(floor): base_floor=floor[0] new_list=[[0]*5 for _ in range(5)] for _ in range(3): for i in range(5): for j in range(5): new_list[j][4-i]=base_floor[i][j] floor.append(new_list) base_floor=new_list new_list = [[0] * 5 for _ in range(5)] return floor def check_same(floor): for i in range(4): for j in range(i+1,4): if floor[i]: if floor[i]==floor[j]: floor[j]=[] return [i for i in floor if i] def bfs(maze): global answer q=deque([(0,0,0,0)]) visited=[[[False]*5 for _ in range(5)] for _ in range(5)] while q: cy,cx,cz,cv=q.popleft() if cy==4 and cx==4 and cz==4: if cv==12: print(12) exit(0) answer=min(answer,cv) return visited[cy][cx][cz]=True for dir in range(6): ny,nx,nz=cy+dy[dir],cx+dx[dir],cz+dz[dir] if 0<=ny<5 and 0<=nx<5 and 0<=nz<5 and not visited[ny][nx][nz] and maze[ny][nx][nz]: q.append((ny,nx,nz,cv+1)) dy=[0,0,1,-1,0,0] dx=[1,-1,0,0,0,0] dz=[0,0,0,0,1,-1] ps=list(permutations([0,1,2,3,4],5)) answer=125 floors=[check_same(rotate([[list(map(int,input().split())) for _ in range(5)]])) for _ in range(5)] for one,two,three,four,five in ps: for i in range(len(floors[one])): for j in range(len(floors[two])): for k in range(len(floors[three])): for l in range(len(floors[four])): for m in range(len(floors[five])): cur_maze=[floors[one][i],floors[two][j],floors[three][k],floors[four][l],floors[five][m]] if cur_maze[0][0][0] and cur_maze[4][4][4]: bfs(cur_maze) print(answer if answer!=125 else -1)
'BOJ PS > Python' 카테고리의 다른 글
백준 13334 - 철로 (Python) (0) 2023.07.10 백준 3745 - 오름세 (Python) (0) 2023.07.10 백준 1507 - 궁금한 민호 (Python) (0) 2023.07.10 백준 11780 - 플로이드 2 (Python) (0) 2023.07.10 백준 1949 - 우수 마을 (Python) (0) 2023.07.10