梯子を探してゲームを...

2981 ワード


上と同じ梯子に登りましょう.
まず,アレイを用いて梯子を実現する.
総高さ7,幅5の配列を簡単に作成しましょう.[高さ](Height)の値は、勾配が複雑な場合ほど大きくなりますが、例では高さを大幅に小さくする必要はありません.
上のはしごをアレイとして実装すると、以下のようになります.
[
    [0, 0, 0, 0, 0],
    [0, 1, 1, 0, 2],
    [0, 0, 0, 2, 0],
    [3, 0, 0, 0, 0],
    [0, 0, 4, 4, 0],
    [0, 3, 0, 0, 0],
    [0, 0, 0, 0, 0]
]
便宜上、はしごから下りた幹、横に移動した幹、幹と枝が出会う場所をノードとして表します.
配列の最上位の[0,0,0,0,0,0]および最下位の[0,0,0,0]は、開始位置および終了位置を表示するための装置である.
上の勾配配列で0に遭遇した場合は、下に下がります.ゼロ以外の数字に遭遇すると、ある枝に出会って、枝に沿って別の枝から滑り落ちます.勾配の下部に達するまで、この手順を繰り返します.
そして梯子の枝の整数値1.2.3を...と表示されます.はしごに沿って歩いて2行2列のノードに達すると、同じ値の行、列を検索し、2行3列のノードにジャンプします.
各台形の整数値が異なるのは,すべての異なる分岐を区別するためである.
次のコードを使用すると、梯子に移動できます.
def findPathInLadder(starting: int, board: list, desti: list):
    
    position_row = 0
    position_col = starting-1
    crossing = False # 사다리를 만났을 때 건너가는 중이면 True, 아니면 False
    
    current = board[position_row][position_col]
    while position_row < len(board)-1: # 사다리가 끝지점에 도착할 때까지 반복
        if current == 0 or (crossing and current != 0): # 만약 현재 위치의 배열값이 0이라면 / 혹은 가지를 건너온 후라면
            position_row += 1 # 아래로 내려감
            current = board[position_row][position_col] # current값 갱신
            crossing = False # 가지를 건너왔으므로 False로 갱신
        elif not crossing and current != 0: # 만약 현재 위치의 배열값이 0이 아니고 아직 가지를 건너기 전이라면 == 이제 가지를 건너야 한다면
            crossing = True # 기지를 건너야하므로 True로 갱신
            for i in range(1, len(board)-1): # 배열의 첫행부터 마지막행을 제외한 나머지 행을 탐색
                if position_col == 0: # 만약 제일 왼쪽 열일 경우
                    if board[i][position_col+1] == current: # 오른쪽 열만 탐색
                        position_row = i
                        position_col += 1
                        current = board[position_row][position_col]
                        break
                elif position_col == len(board[0])-1: # 만약 제일 오른쪽 열일 경우
                    if board[i][position_col-1] == current: # 왼쪽 열만 탐색
                        position_row = i
                        position_col -= 1
                        current = board[position_row][position_col]
                        break
                elif 0 < position_col < len(board[0])-1: # 중간일 경우, 양쪽 열을 모두 탐색
                    if board[i][position_col+1] == current:
                        position_row = i
                        position_col += 1
                        current = board[position_row][position_col]
                        break
                    elif board[i][position_col-1] == current:
                        position_row = i
                        position_col -= 1
                        current = board[position_row][position_col]
                        break
            if position_row == len(board)-1 :
                break
    destination = desti[position_col]
    if destination == starting:
        return True
    return False