백준 1726 로봇

gmlwlswldbs·2022년 1월 9일
0

코딩테스트

목록 보기
99/130
from collections import deque
import sys

dx = [0, 0, 1, -1]
dy = [1, -1, 0, 0]
input = sys.stdin.readline

m, n = map(int, input().split())
g = [list(map(int, input().split())) for _ in range(m)]
sx, sy, sd = map(int, input().split())
ax, ay, ad = map(int, input().split())

q = deque()
check = [[[-1] * 4 for _ in range(n)] for _ in range(m)]
q.append((sx-1, sy-1, sd-1, 0))
check[sx-1][sy-1][sd-1] = 0
while q:
    x, y, d, o = q.popleft()
    if x == ax - 1 and y == ay - 1 and d == ad - 1:
        print(o)
        break
    for step in range(1, 4):
        nx, ny = x + (step * dx[d]), y + (step * dy[d])
        if nx < 0 or ny < 0 or nx >= m or ny >= n or g[nx][ny] == 1:
            break
        # 우선순위를 이동에 줌 (더 많은 칸을 이동할 수 있으니까)
        if check[nx][ny][d] == -1 or check[nx][ny][d] == o+1:
            q.append((nx, ny, d, o+1))
            check[nx][ny][d] = o + 1
        else:
            break
    for dir in range(4):
        if dir != d and check[x][y][dir] == -1:
            if (d == 0 and dir == 1) or (d == 1 and dir == 0) or (d == 3 and dir == 2) or (d == 2 and dir == 3):
                q.append((x, y, dir, o+2))
                check[x][y][dir] = o + 2
            else:
                q.append((x, y, dir, o+1))
                check[x][y][dir] = o + 1

명령 1, 2룰 넣어서 bfs 돌림.

// 방향 순서도 변경해줌
if check[x][y][(d-1)%4] == -1:
        q.append((x, y, (d-1)%4, o+1))
    if check[x][y][(d+1)%4] == -1:
        q.append((x, y, (d+1)%4, o+1))
--------------------------------------------------
if d == 0 or d == 1:
        q.append((x, y, 2, o+1))
        q.append((x, y, 3, o+1))
    else:
        q.append((x, y, 0, o+1))
        q.append((x, y, 1, o+1))

처음에 명령2를 이런식으로 구현해서 메모리 초과 남. 큐에 같은 값이 너무 많이 들어가고 계속 한자리에서 돌아가는 문제가 있음. check 배열을 3차원으로 해서 방향을 넣고, 180도 회전은 2번 돌아간다고 생각해줌

while q:
    x, y, d, o = q.popleft()
    if x == ax - 1 and y == ay - 1 and d == ad - 1:
        print(o)
        break
    for step in range(1, 4):
        nx, ny = x + (step * dx[d]), y + (step * dy[d])
        if nx < 0 or ny < 0 or nx >= m or ny >= n:
            break
        if check[nx][ny][d] == -1 and g[nx][ny] == 0:
            q.append((nx, ny, d, o+1))
            check[nx][ny][d] = 0
        else:
            break
    for dir in range(4):
        if dir != d and check[x][y][dir] == -1:
            check[x][y][dir] = 0
            if (d == 0 and dir == 1) or (d == 1 and dir == 0) or (d == 3 and dir == 2) or (d == 2 and dir == 3):
                q.append((x, y, dir, o+2))
            else:
                q.append((x, y, dir, o+1))

수정해서 이렇게 했는데 바로 틀렸습니다 나옴
4 2
0 0
0 0
1 0
0 0
1 1 3
4 1 3
이런 반례가 있고 (질문 게시판에서 주움) 저렇게 하면 만약 명령1과 명령2(180도 돈 경우)로 도착한 시간이 같을 경우 우선순위가 명령2에 있게 돼서 틀리는 경우가 있어서 맨 처음 코드에서 주석 부분을 수정해주었다.

0개의 댓글