728x90
https://www.acmicpc.net/problem/15684
15684번: 사다리 조작
사다리 게임은 N개의 세로선과 M개의 가로선으로 이루어져 있다. 인접한 세로선 사이에는 가로선을 놓을 수 있는데, 각각의 세로선마다 가로선을 놓을 수 있는 위치의 개수는 H이고, 모든 세로선
www.acmicpc.net
1. 문제 설명
2. 문제 풀이
2차원 배열로 만들어
1. 백트래킹을 이용해 가로선을 만들고
2. 만든 가로선으로 i번 세로선의 결과가 i번이 나오는지 체크한다.
3. 코드
import sys
def check():
# i번 세로선의 결과가 i번이 나오는지 체크
for i in range(n):
temp = i # 이동하는 세로선 위치
for j in range(h):
if graph[j][temp]: # 오른쪽이 1인 경우
temp += 1
elif temp > 0 and graph[j][temp - 1]: # 왼쪽이 1인 경우
temp -= 1
if temp != i:
return False
return True
def dfs(cnt, x, y):
# cnt: 가로선을 만든 횟수
global ans
if ans <= cnt: # 가로선을 정답보다 많이 만든 경우 확인 필요 x
return
if check(): # i번 세로선의 결과가 i번이 나오는지 체크
ans = min(ans, cnt)
return
if cnt == 3:
return
for i in range(x, h):
k = y if i == x else 0 # 같은 세로줄 확인하면 y부터 확인. 세로줄 다르면 0부터
for j in range(k, n - 1):
if graph[i][j] == 0: # 0인 경우 가로줄 만들고, 연속된 가로선을 만들지 않기 위해 j + 2호출
graph[i][j] = 1
dfs(cnt + 1, i, j + 2)
graph[i][j] = 0
n, m, h = map(int, sys.stdin.readline().split()) # 세로, 가로, 세로선마다 가로선을 놓을수 있는 위치 수
graph = [[0]*n for _ in range(h)]
for _ in range(m):
a, b = map(int, sys.stdin.readline().split()) # 가로, 세로선
graph[a - 1][b - 1] = 1
ans = 4
dfs(0, 0, 0)
print(ans if ans <= 3 else -1)
728x90
'Programming > python' 카테고리의 다른 글
백준 : 9205(맥주 마시면서 걸어가기) [파이썬] (0) | 2023.05.22 |
---|---|
백준 12100 : 2048(Easy) [파이썬] (0) | 2023.03.13 |
SWEA 점심 식사시간 [파이썬] (0) | 2023.03.06 |
SWEA 원자 소멸 시뮬레이션 [파이썬] (0) | 2023.03.04 |
백준 6087 : 레이저 통신 [파이썬] (0) | 2023.02.25 |