BOJ 1261アルゴ駅


https://www.acmicpc.net/problem/1261
時間1秒、メモリ128 MB
input :
  • 横M、縦N(1≦N、M≦100)
  • 0は空き部屋、1は壁
  • を表します
  • (1,1)および(N,M)は常に貫通する
    output :
  • 出力
  • 条件:
  • 一部の部屋が移動可能な部屋は上下左右に隣接する空き部屋
  • です
    bfsの問題が外線だとは知らなかったが、抱きしめただけだ.少なくとも壁を破らなければならないので、正しいのではないでしょうか...
    例外はない.
    毎日歩き続けるとき.
    nx>n,ny>mなのでエラーになります.
    =を含めると、グラフの外に表示されないようになります.
    関数の動作は、次の移動する点に壁があるかどうかです.
    あなたはもうその場所に行ったことがありません.
    visit[x][y]+1今回は壁の存在により穿孔回数が増加
    visit[nx][ny]の値より小さい場合はqに追加します.
    壁がないときも上記の方法を繰り返します.
    import sys
    from _collections import deque
    
    m, n = map(int, sys.stdin.readline().split())
    graph = []
    for i in range(n):
        graph.append(list(map(int, sys.stdin.readline().strip())))
    visit = [[99999] * m for i in range(n)]
    dx = [-1, 1, 0, 0]
    dy = [0, 0, -1, 1]
    
    
    def bfs():
        q = deque([])
        q.append((0, 0))
        visit[0][0] = 0
    
        while q:
            x, y = q.popleft()
            for i in range(4):
                nx = x + dx[i]
                ny = y + dy[i]
                if nx >= n or nx < 0 or ny >= m or ny < 0:
                    continue
                # 다음 이동하는 곳에 벽이 존재.
                if graph[nx][ny] == 1:
                    if visit[nx][ny] == 99999 or visit[nx][ny] > visit[x][y] + 1:
                        visit[nx][ny] = visit[x][y] + 1
                        q.append((nx, ny))
                else:
                    if visit[nx][ny] == 99999 or visit[nx][ny] > visit[x][y]:
                        visit[nx][ny] = min(visit[nx][ny], visit[x][y])
                        q. append((nx, ny))
    
    bfs()
    print(visit[n - 1][m - 1])