Algorithm/Python

[백준 1580] 위치 바꾸기

🥭맹2 2021. 4. 14. 22:50

1. 문제

www.acmicpc.net/problem/1580

 

1580번: 위치 바꾸기

첫째 줄에 게임 판의 세로 크기 N과 가로 크기 M이 주어진다. N과 M은 20보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에 게임 판의 상태가 주어진다. 빈 공간은 ., 벽은 X, A의 위치는 A, B의 위

www.acmicpc.net

2. 접근 방법

구슬 탈출과 유사한 BFS 문제입니다

 

1. A와 B의 위치를 담는다

2. deque에다가 초기 위치를 담는다. + visit 체크

3. 만약 A가 B의 위치, B가 A의 위치에 있다면 ! => count 출력하고 끗

4. 3이 아니라면 다음에 갈 위치를 하나씩 확인하기

4-1. 벽인지 아닌지

4-2. 이미 들린 곳인지

4-3. A와 B가 크로스 되는지 (현재 A위치와 B위치가 스위칭 되는 상태)

4-4. A와 B가 같은 위치로 가는지

5. 4-1~4가 모두 아니라면, queue에 다시 담기 (count+=1)

6. bfs를 모두 돌았다면, -1을 출력

 

3. 코드

python

from collections import deque

def isWall(x, y):
    if x < 0 or y < 0 or x >= M or y >= N or board[y][x] == 'X':
        return True
    return False

def bfs():
    global _ax, _ay, _bx, _by, goalA, goalB
    while q:
        ax, ay, bx, by, c = q.popleft()
        if ax == _bx and ay == _by and bx == _ax and by == _ay:
            print(c)
            return

        for i in range(9):
            nax = ax + dx[i]
            nay = ay + dy[i]
            if isWall(nax, nay):
                continue

            for j in range(9):
                nbx = bx + dx[j]
                nby = by + dy[j]
                if isWall(nbx, nby):
                    continue

                if visited[nay][nax][nby][nbx]:
                    continue

                if nax == nbx and nay == nby:
                    continue

                if nax == bx and nay == by and nbx == ax and nby == ay:
                    continue

                if not visited[nay][nax][nby][nbx]:
                    q.append((nax, nay, nbx, nby, c+1))
                    visited[nay][nax][nby][nbx] = True
    print(-1)

N, M = map(int, input().split())
board = [list(input()) for _ in range(N)]
visited = [[[[False]*M for _ in range(N)] for _ in range(M)] for _ in range(N)]
dx, dy = (0, 1, 1, 1, 0, -1, -1, -1, 0), (-1, -1, 0, 1, 1, 1, 0, -1, 0)

for y in range(N):
    for x in range(M):
        if board[y][x] == 'A':
            _ax, _ay = x, y
        elif board[y][x] == 'B':
            _bx, _by = x, y

q = deque()
q.append((_ax, _ay, _bx, _by, 0))
visited[_ay][_ax][_by][_bx] = True
bfs()

4. 마치며

구슬 탈출에서 4차 행렬을 맞이하고

예전에 풀려고 시도했다가 감도 못잡고 못풀었던 이 문제가 갑자기 생각나서

시도했는데

 

역시나 같은 문제였슴다 ~!

 

화이팅 !@!@!@!@

'Algorithm > Python' 카테고리의 다른 글

[백준 12100] 2048(Easy)  (0) 2021.04.15
[백준 13460] 구슬 탈출2  (0) 2021.04.15
[백준 13459] 구슬 탈출  (0) 2021.04.14
[백준 17090] 미로 탈출하기  (0) 2021.04.14
[백준 2110] 공유기 설치  (0) 2021.03.31