티스토리 뷰

반응형

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

 

13460번: 구슬 탈출 2

첫 번째 줄에는 보드의 세로, 가로 크기를 의미하는 두 정수 N, M (3 ≤ N, M ≤ 10)이 주어진다. 다음 N개의 줄에 보드의 모양을 나타내는 길이 M의 문자열이 주어진다. 이 문자열은 '.', '#', 'O', 'R', 'B'

www.acmicpc.net

 


⊙ 문제

⊙ 입력

⊙ 출력

⊙ 예제 입출력

⊙ 알고리즘 분류

  • 구현
  • 그래프 이론
  • 그래프 탐색
  • 너비 우선 탐색

 


 

⊙ 문제 접근 과정

 

 

빨간 구슬의 좌표와 파란 구슬의 좌표를 담을 변수를 설정해준다.

 

그리고 현재 빨간 구슬의 좌표와 파란 구슬의 좌표를 찾아내어 변수에 저장해주고 큐에 추가한다.

그리고 bfs를 돌려준다. 10번 이상으로 움직였을 시는 멈추고 아닐 시,

move 메서드를 사용하여 구슬을 움직여준다. 언제까지?

구멍이 아니거나 벽이 아닐 때까지.

 

그리고 10번 안에 빨간 구슬이 구멍에 떨어지면 count를 return 해주고 종료한다.

안 떨어지면 방문 처리하고, 다시 q에 현재 좌표를 추가해주고 반복해준다.

 


 

⊙ 문제 풀이

 

import sys
from collections import deque

input = sys.stdin.readline

N, M = map(int, input().split())
arr = [list(input().strip()) for _ in range(N)]
visited = []
dx = [0, 0, 1, -1]
dy = [1, -1, 0, 0]
q = deque()

rx, ry, bx, by = 0, 0, 0, 0

for i in range(N):
    for j in range(M):
        if arr[i][j] == 'R':
            rx, ry = i, j
        if arr[i][j] == 'B':
            bx, by = i, j

q.append([rx, ry, bx, by, 1])
visited.append([rx, ry, bx, by])


def move(x, y, i, j):
    count = 0
    while arr[x+i][y+j] != '#' and arr[x][y] != 'O':
        x += i
        y += j
        count += 1
    return x, y, count


def bfs():
    while q:
        rx, ry, bx, by, cnt = q.popleft()

        if cnt > 10:
            break
        for i in range(4):
            nrx, nry, rCnt = move(rx, ry, dx[i], dy[i])
            nbx, nby, bCnt = move(bx, by, dx[i], dy[i])

            if arr[nbx][nby] == 'O':
                continue

            if arr[nrx][nry] == 'O':
                return cnt

            if nrx == nbx and nry == nby:
                if rCnt > bCnt:
                    nrx -= dx[i]
                    nry -= dy[i]
                else:
                    nbx -= dx[i]
                    nby -= dy[i]

            if [nrx, nry, nbx, nby] not in visited:
                visited.append([nrx, nry, nbx, nby])
                q.append([nrx, nry, nbx, nby, cnt+1])
    return -1


print(bfs())

 


⊙ 결과

 


⊙ 마무리

 

 

진짜 어렵다....

 

 

좋아요는 로그인하지 않아도 누를 수 있습니다!

728x90
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함