|
| 1 | +from collections import deque |
| 2 | + |
| 3 | +n = int(input()) |
| 4 | +mapp = [list(map(int, input().split())) for _ in range(n)] |
| 5 | + |
| 6 | +dx = [1, 1, 0] # 가로, 대각선, 세로 이동 |
| 7 | +dy = [0, 1, 1] |
| 8 | +now = [0, 1, 2] # 0: 가로, 1: 대각선, 2: 세로 |
| 9 | + |
| 10 | +# DP 테이블 (경로 개수 저장) |
| 11 | +dp = [[[0] * 3 for _ in range(n)] for _ in range(n)] |
| 12 | + |
| 13 | +# BFS 큐 생성 |
| 14 | +que = deque([(0, 1, 0)]) # (y, x, 방향) |
| 15 | +dp[0][1][0] = 1 # (0,1)에서 가로 방향 시작 |
| 16 | + |
| 17 | +def bfs(): |
| 18 | + while que: |
| 19 | + y, x, pipe_now = que.popleft() |
| 20 | + |
| 21 | + for i in range(3): # 3가지 방향 이동 |
| 22 | + if abs(i - pipe_now) > 1: |
| 23 | + continue # 가로↔세로 직접 변경 불가 |
| 24 | + |
| 25 | + yy, xx = y + dy[i], x + dx[i] |
| 26 | + |
| 27 | + if 0 <= yy < n and 0 <= xx < n and mapp[yy][xx] == 0: # 벽이 아닐 때 |
| 28 | + if i == 1: # 대각선 이동 시 추가 검사 |
| 29 | + if mapp[y][x+1] == 1 or mapp[y+1][x] == 1: |
| 30 | + continue # 대각선 이동 불가 |
| 31 | + |
| 32 | + # 새로운 위치에 대해 기존 경로 개수를 더함 (DP 적용) |
| 33 | + dp[yy][xx][i] += dp[y][x][pipe_now] |
| 34 | + |
| 35 | + # 큐에 새로운 상태 추가 |
| 36 | + que.append((yy, xx, i)) |
| 37 | + |
| 38 | +bfs() |
| 39 | +print(sum(dp[n-1][n-1])) # (n-1, n-1)에 도착하는 모든 경우의 수 합산 |
0 commit comments