상세 컨텐츠

본문 제목

[백준16954번] 움직이는 미로 탈출(파이썬)

알고리즘 공부

by Tabris4547 2022. 7. 1. 15:52

본문

728x90

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

 

16954번: 움직이는 미로 탈출

욱제는 학교 숙제로 크기가 8×8인 체스판에서 탈출하는 게임을 만들었다. 체스판의 모든 칸은 빈 칸 또는 벽 중 하나이다. 욱제의 캐릭터는 가장 왼쪽 아랫 칸에 있고, 이 캐릭터는 가장 오른쪽

www.acmicpc.net

이 문제는 쉬운 bfs문제처럼 보이지만

'벽이 움직인다'라는 까다로운 조건이 붙어서

애를 많이 먹었습니다.

저는 처음에

while wall:
    wx,wy=wall.pop(0)
    nwx=wx+1
    if nwx>=8:
        continue

    else:
        if [nwx,wy] in man:
            p=man.index([nwx,wy])
            man.pop(p)
        room[nwx][wy]='#'
        new_wall.append([nwx,wy])
    room[wx][wy]='.'
wall=new_wall

이렇게 벽을 이동시켜도보고

for x in range(7,-1,-1):
    for y in range(8):
        if room[x][y]=='#':
            if x==7:
                room[x][y]='.'
            else:
                room[x+1][y]='#'
                room[x][y]='.'
                if [x+1,y] in man:
                    p=man.index([x+1,y])
                    man.pop(p)

 

이렇게도 벽을 이동시켜봤지만...

어디선가 뭔가 계속 꼬였습니다.

결국 구글링을 하다가 알아낸 건

지도를 받을 때 deque로 받은 후,

마지막 줄을 pop를 한 후,

새로운 줄을 계속 더해주는 방식이었습니다.

그럼 맨 아래로 간 벽은 사라지는 식이었죠.

#백준 16954 움직이는 미로 탈출
from collections import deque


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

room=deque(list(input())for _ in range(8))

man=deque()
man.append([7,0])
new=['.','.','.','.','.','.','.','.']


turn=0
out=False
while man:
    len_man=len(man)
    for _ in range(len_man):
        x,y=man.popleft()
        if x==0 and y==7:
            out=True
            break
        if room[x][y]=='#':
            continue

        for d in range(9):
            nx=x+dx[d]
            ny=y+dy[d]

            if nx<0 or nx>=8 or ny<0 or ny>=8:
                continue

            if room[nx][ny]=='#':
                continue
            man.append([nx,ny])
    if out==True:
        break
    room.pop()
    room.appendleft(new)
    turn+=1
    if turn==9:
        out=True
        break
if out==True:
    print(1)
else:
    print(0)

 

https://data-flower.tistory.com/92

 

[백준 16954번] 움직이는 미로 탈출 - 파이썬

문제 링크: https://www.acmicpc.net/problem/16954 16954번: 움직이는 미로 탈출 욱제는 학교 숙제로 크기가 8×8인 체스판에서 탈출하는 게임을 만들었다. 체스판의 모든 칸은 빈 칸 또는 벽 중 하나이다. 욱

data-flower.tistory.com

도움이 되었던 코드입니다.

 

https://ku-hug.tistory.com/151

 

[Python/파이썬] 백준 16954번: 움직이는 미로 탈출

문제 풀이 벽이 한 칸 내려오는 것 = 욱제가 한 칸 위로 올라가는 것 또한 욱제가 맨 위칸으로 올라가기만 하면, 가장 오른쪽으로 갈 수 있다. (1초 뒤에는 욱제와 같은 칸에 있는 벽들이 전부 아

ku-hug.tistory.com

이외에도

벽이 아래로 내려오는 걸 관점을 달리해서

'욱제가 한 칸 위로 움직인다'

라고 보고 해석한 코드도 있습니다.

이 방식을 보고 해석이 독특해서 

참신하다는 생각이 들었습니다.

728x90

관련글 더보기

댓글 영역