BackJoon
10164 격자상의 경로 [python]
싸비
2016. 12. 1. 21:35
k 포인트 기준으로 두개의 영역으로 나눠 그 경우의수를 곱하는 방식을 이용하였다.
메모제이션을 사용하지않고 완전탐색을 하면 15x15 크기여도 시간초과로 인해 풀 수가 없다.
각 이동경로마다 방문된 곳이면 방문하지않고 방문된곳의 크기를 올리는 방식으로 문제를 풀었다
방문하는방법은 bfs를 이용하였다.
def bfs(sy, sx, ey, ex): direct = [[0, 1], [1, 0]] q = [(sy, sx)] matrix[sy][sx] = 1 while q: y, x = q.pop(0) for dy, dx in direct: cy = dy + y cx = dx + x if cy >= ey + 1 or cx >= ex + 1: continue if matrix[cy][cx]: matrix[cy][cx] += matrix[y][x] else: matrix[cy][cx] += matrix[y][x] q.append((cy, cx)) return matrix[ey][ex] n, m, k = map(int, input().split()) matrix = [[0] * m for j in range(n)] if k == 0: ky, kx = 0, 0 else: k -= 1 ky, kx = k // m, k % m print(bfs(0, 0, ky, kx) * bfs(ky, kx, n - 1, m - 1))