-
BOJ 17070 파이프 옮기기 1(python 3)알고리즘/BOJ 2019. 4. 11. 02:18반응형
https://www.acmicpc.net/problem/17070
파이프 옮기기 1의 코드는 시간 제한 때문에 pypy3으로 제출해야합니다.
main함수는 이렇습니다.
12345n = int(input())D = [[*map(int, input().split())] for _ in range(n)]k = 0dfs(0, 1, 0)print(k)cs k는 도착점에 도착하는 방법의 수 입니다.
파이프의 끝의 좌표가 (1,2) 이므로 (0,1)에서 dfs를 시작하도록 하였습니다.
dfs함수는 이렇습니다.
123456789101112131415def dfs(x, y, z):# → 0, ↘ 1, ↓ 2global kif x == n - 1 and y == n - 1: k += 1if z == 0 or z == 1: #파이프 방향 확인if y + 1 < n: # 맵을 넘지 못하게 설정if D[x][y + 1] == 0: # 칸에 벽이 없는지 확인dfs(x, y + 1, 0)if z == 0 or z == 1 or z == 2:if x + 1 < n and y + 1 < n:if D[x + 1][y] == D[x][y + 1] == D[x + 1][y + 1] == 0:dfs(x + 1, y + 1, 1)if z == 1 or z == 2:if x + 1 < n:if D[x + 1][y] == 0:dfs(x + 1, y, 2)cs dfs함수에서 x,y,z인자를 받는데요.
x,y는 좌표이고, z는 파이프의 방향을 숫자로 표현하였습니다.(z = → 0, ↘ 1, ↓ 2)
문제에서 요구한대로 칸이 색칠되어 있는 곳은 벽이 없어야 파이프를 이동할 수 있게 하였습니다.
이렇게 해서 완성된 코드입니다.
123456789101112131415161718192021def dfs(x, y, z):# → 0, ↘ 1, ↓ 2global kif x == n - 1 and y == n - 1: k += 1if z == 0 or z == 1: #파이프 방향 확인if y + 1 < n: # 맵을 넘지 못하게 설정if D[x][y + 1] == 0: # 칸에 벽이 없는지 확인dfs(x, y + 1, 0)if z == 0 or z == 1 or z == 2:if x + 1 < n and y + 1 < n:if D[x + 1][y] == D[x][y + 1] == D[x + 1][y + 1] == 0:dfs(x + 1, y + 1, 1)if z == 1 or z == 2:if x + 1 < n:if D[x + 1][y] == 0:dfs(x + 1, y, 2)n = int(input())D = [[*map(int, input().split())] for _ in range(n)]k = 0dfs(0, 1, 0)print(k)cs 반응형'알고리즘 > BOJ' 카테고리의 다른 글
[BOJ 2810, C++] 컵홀더 (0) 2021.07.26 BOJ 17069 파이프 옮기기 2(python 3) (0) 2019.04.11 BOJ 17135 캐슬 디펜스(Python 3) (0) 2019.04.08 BOJ 13905 세부(Python 3) (0) 2019.03.12 BOJ 1738 골목길(Python 3) (0) 2019.03.07