

- 사다리가 놓여진 위치 표시를 board 2차원 리스트로 해주었다
-> board[i][j]에서 i는 사다리 가로선의 행번호, j는 사다리 시작점의 열번호 
backtracking(depth, x, y)
- depth는 추가한 사다리의 개수임
 
- x, y 위치에서부터 사다리를 하나씩 추가로 설치하면서 backtracking을 진행함
 
- board[i][j], board[i][j+1] 위치에 사다리가 없고, j>0일 때 board[i][j-1]인 경우 외의 경우에 사다리를 i, j 위치에 설치할 수 있음
-> 재귀호출을 할 때, 해당 세로선 위치 + 2 부터 사다리를 추가할 수 있기 때문에 backtracking(depth+1, i, j+2) 형식으로 재귀호출을 진행해야함 
- depth가 3보다 큰 경우 return
 
- is_complete()가 True라면 result를 갱신해주고 return
 
is_complete()
- 현재 board의 상태에서 문제의 조건에 맞게 도착점에 도착하는 지를 check하는 함수
 
구현이 어려운 backtracking 문제였다
import sys
from collections import deque
def is_complete():
    for j in range(N): 
        check = j
        for i in range(H):
            if board[i][check]:
                check += 1
            elif check > 0 and board[i][check-1]:
                check -= 1
        if check != j: 
            return False
    return True
def backtracking(depth, x, y): 
    global result
    if depth > 3:
        return
    elif is_complete():
        result = min(result, depth)
        return
    for i in range(x, H):
        if i == x: startY = y
        else: startY = 0
        for j in range(startY, N - 1):
            if not board[i][j] and not board[i][j+1]:
                if j > 0 and board[i][j-1]:
                    continue
                board[i][j] = True
                backtracking(depth + 1, i, j+2)
                board[i][j] = False
N, M, H = list(map(int, sys.stdin.readline()[:-1].split())) 
board = [[False] * N for _ in range(H)]
if M == 0:
    print(0); exit()
for m in range(M):
    tmp = list(map(int, sys.stdin.readline()[:-1].split()))
    tmp[0] -= 1; tmp[1] -= 1
    board[tmp[0]][tmp[1]] = True 
result = 4
backtracking(0, 0, 0)
if result < 4:
    print(result)
else:
    print(-1)