[python]白駿13460:仙丹を脱出する2



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

に答える

  • 4方向のすべての可能な位置と移動回数
  • を確認する.
  • 一度傾いたときに1つの青いビーズが落下すると、次の方法
  • に移る.
  • 赤いボールが穴に落ちたら、cntを
  • に渡します.
  • 訪問した場所は訪問方式で検査を行い、
  • の重複を避ける.
  • のビーズの位置が同じである場合、前の位置と大きく異なるビーズ
  • を後に置く.

    コード#コード#

    import sys
    input = sys.stdin.readline
    from collections import deque
    
    n, m = map(int, input().split())
    maps = []
    r_position = [0, 0]
    b_position = [0, 0]
    for i in range(n):
        temp = [x for x in input().rstrip()]
        if 'R' in temp:
            r_position = [temp.index('R'), i]
    
        if 'B' in temp:
            b_position = [temp.index('B'), i]
        maps.append(temp)
    
    #0: 왼쪽, 1: 오른쪽, 2: 위, 3:아래
    dx = [-1, 1, 0, 0]
    dy = [0, 0, -1, 1]
    cnt = 1
    q = deque()
    q.append((cnt, r_position, b_position))
    
    maps[r_position[1]import sys
    input = sys.stdin.readline
    from collections import deque
    
    n, m = map(int, input().split())
    maps = []
    rx, ry, bx, by = 0, 0, 0, 0
    for i in range(n):
        temp = [x for x in input().rstrip()]
        if 'R' in temp:
            rx, ry = temp.index('R'), i
    
        if 'B' in temp:
            bx, by = temp.index('B'), i
        maps.append(temp)
    
    #0: 왼쪽, 1: 오른쪽, 2: 위, 3:아래
    dx = [-1, 1, 0, 0]
    dy = [0, 0, -1, 1]
    cnt = 1
    q = deque()
    q.append([cnt, rx, ry, bx, by])
    
    maps[ry][rx] = "."
    maps[by][bx] = "."
    visited = [[rx,ry,bx,by]]
    
    def tilt():
        while q:
            cnt, rx, ry, bx, by = q.popleft()
            for i in range(4):
                r_nx, r_ny = rx, ry
                b_nx, b_ny = bx, by
                # 파란 구슬 이동
                while maps[b_ny + dy[i]][b_nx + dx[i]] == ".":
                    b_nx += dx[i]
                    b_ny += dy[i]
                # 파란 구슬이 빠질경우 다음 케이스로 넘어가기
                if maps[b_ny + dy[i]][b_nx + dx[i]] == "O":
                    continue
                # 빨간 구슬 이동
                while maps[r_ny + dy[i]][r_nx + dx[i]] == ".":
                    r_nx += dx[i]
                    r_ny += dy[i]
                if maps[r_ny + dy[i]][r_nx + dx[i]] == "O":
                    return cnt
                else:
                    if r_nx == b_nx and r_ny == b_ny:  # 같은 위치일 경우 더 많이 움직인 구슬을 뒤에
                        if abs(rx - r_nx) + abs(ry - r_ny) > abs(bx - b_nx) + abs(by - b_ny):
                            r_nx = r_nx - dx[i]
                            r_ny = r_ny - dy[i]
                        else:
                            b_nx = b_nx - dx[i]
                            b_ny = b_ny - dy[i]
                    if [r_nx, r_ny, b_nx, b_ny] not in visited:
                        q.append((cnt + 1, r_nx, r_ny, b_nx, b_ny))
                        visited.append([r_nx, r_ny, b_nx, b_ny])
            if cnt > 10:
                return -1
        return -1
    print(tilt())
    質問中の反例はすべてスキップしてどこが間違っていることを知りません...ああ...
    3时间以上かかってやっと解けたのに、当てにならなかった.ねばねば
    記号...>=から>に変更して通過しました.空っぽすぎて...元気を出す