DFSを開く


  • https://www.youtube.com/watch?v=qpBUjNSzGX8
  • https://editor.p5js.org/talksis/sketches/Zln0cTKY5
  • 📌ベストプラクティス(フルナビゲーション)


  • 黒:歩いた道
  • 緑色:上下左右ナビゲーション
  • route = [
        [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
        [1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1],
        [1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1],
        [1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1],
        [1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1],
        [1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1],
        [1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1],
        [1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1],
        [1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1],
        [1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1],
        [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
        [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
    ]
    
    s = len(route)
    dx = [-1, 0, 1, 0]
    dy = [0, 1, 0, -1]
    
    
    def dfs(x, y):
        if route[x][y] != 0:
            return
    
        if [x, y] == [s - 1, s - 1]:
            return
    
        route[x][y] = 2  # 밟은 위치는 다시 방문 하지 않도록
        for i in range(4):
            dfs(x + dx[i], y + dy[i])
        route[x][y] = 0  # 밟았던 길을 원래대로 복구 (다른 재귀에서 방해받지 않기 위해서)
    
    
    dfs(1, 1)

    📌上下左右に移動するたびに、道を踏んで修復されます。


    ベストプラクティスと同様
    def dfs(x, y):
        if route[x][y] != 0:
            return
    
        if [x, y] == [s - 1, s - 1]:
            return
    
        for i in range(4):
            route[x][y] = 2  # 밟은 위치는 다시 방문 하지 않도록
            dfs(x + dx[i], y + dy[i])
            route[x][y] = 0  # 밟았던 길을 원래대로 복구 (다른 재귀에서 방해받지 않기 위해서)
    
    
    dfs(1, 1)

    📌目的地に到着したらDFSを停止します。


    finish = False
    
    
    def dfs(x, y):
        global finish
    
        if finish:
            return
    
        if route[x][y] != 0:
            return
    
        if [x, y] == [s - 1, s - 1]:
            finish = True
            return
    
        route[x][y] = 2  # 밟은 위치는 다시 방문 하지 않도록
        for i in range(4):
            dfs(x + dx[i], y + dy[i])
        route[x][y] = 0  # 밟았던 길을 원래대로 복구 (다른 재귀에서 방해받지 않기 위해서)
    
    
    dfs(1, 1)
    宛先に到着するとdfsは実行されないため、スタックに新しい関数は蓄積されません.
    最終的には、スタックに存在するすべての関数がポップアップされ、ナビゲーションが終了します.

    📌あなたが踏んだ道を修復しなければ


    
    def dfs(x, y):
        if route[x][y] != 0: # 빈칸이 아니면 탐색을 멈춘다
            return
    
        if [x, y] == [s - 1, s - 1]:
            return
    
        route[x][y] = 2  # 밟은 위치는 다시 방문 하지 않도록
        for i in range(4):
            dfs(x + dx[i], y + dy[i])
        # route[x][y] = 0  # 밟았던 길을 원래대로 복구 (다른 재귀에서 방해받지 않기 위해서)
    
    
    dfs(1, 1)
    1つのケースで探索を行い、その道を回復しなければ、
    次のcaseをブラウズするときは、前のcaseで歩いた道をブラウズしません(if route[x][y] != 0:)

    📌踏んだ道をチェックしないと


    
    def dfs(x, y):
        if route[x][y] != 0: # 빈칸이 아니면 탐색을 멈춘다
            return
    
        if [x, y] == [s - 1, s - 1]:
            return
    
        # route[x][y] = 2  # 밟은 위치는 다시 방문 하지 않도록
        for i in range(4):
            dfs(x + dx[i], y + dy[i])
        # route[x][y] = 0  # 밟았던 길을 원래대로 복구 (다른 재귀에서 방해받지 않기 위해서)
    
    
    dfs(1, 1)
    無限ループに陥る.