ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • BOJ 17070 파이프 옮기기 1(python 3)
    알고리즘/BOJ 2019. 4. 11. 02:18
    반응형

    https://www.acmicpc.net/problem/17070

     

    파이프 옮기기 1의 코드는 시간 제한 때문에 pypy3으로 제출해야합니다.

     

     

    main함수는 이렇습니다.

    1
    2
    3
    4
    5
    = int(input())
    = [[*map(int, input().split())] for _ in range(n)]
    = 0
    dfs(010)
    print(k)
    cs

    k는 도착점에 도착하는 방법의 수 입니다.

    파이프의 끝의 좌표가 (1,2) 이므로 (0,1)에서 dfs를 시작하도록 하였습니다.

     

    dfs함수는 이렇습니다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    def dfs(x, y, z):# → 0, ↘ 1, ↓ 2
        global k
        if x == n - 1 and y == n - 1: k += 1
        if z == 0 or z == 1#파이프 방향 확인
            if y + 1 < n: # 맵을 넘지 못하게 설정
                if D[x][y + 1== 0# 칸에 벽이 없는지 확인
                    dfs(x, y + 10)
        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 + 11)
        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)

    문제에서 요구한대로 칸이 색칠되어 있는 곳은 벽이 없어야 파이프를 이동할 수 있게 하였습니다.

     

     

     

     

     

    이렇게 해서 완성된 코드입니다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    def dfs(x, y, z):# → 0, ↘ 1, ↓ 2
        global k
        if x == n - 1 and y == n - 1: k += 1
        if z == 0 or z == 1#파이프 방향 확인
            if y + 1 < n: # 맵을 넘지 못하게 설정
                if D[x][y + 1== 0# 칸에 벽이 없는지 확인
                    dfs(x, y + 10)
        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 + 11)
        if z == 1 or z == 2:
            if x + 1 < n:
                if D[x + 1][y] == 0:
                    dfs(x + 1, y, 2)
     
    = int(input())
    = [[*map(int, input().split())] for _ in range(n)]
    = 0
    dfs(010)
    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

    댓글

Designed by Tistory.