728x90
- 현재의 문자열을 딕셔너리에 저장한다 : {문자열 : 이동횟수}
- 이동횟수가 적은 순으로 bfs
- 문자열이 123456780이 되는 경우 종료
from collections import deque
# 초기 상태
question = ''
for _ in range(3):
question += ''.join(input().split())
# 목표 상태
goal = '123456780'
# 상태 거리 저장 딕셔너리와 BFS 큐 초기화
dic = {question: 0}
q = deque([question])
# BFS 탐색
while q:
now = q.popleft()
# 목표 상태에 도달한 경우
if now == goal:
print(dic[now])
exit(0)
# '0'의 현재 위치 찾기
zero = now.find('0')
# 이동 가능한 방향 정의 (우, 하, 좌, 상)
directions = [(0, 1), (1, 0), (0, -1), (-1, 0)]
# 각 방향으로 이동 시도
for dx, dy in directions:
nx, ny = zero // 3 + dx, zero % 3 + dy
if 0 <= nx < 3 and 0 <= ny < 3: # 범위 체크
next_pos = 3 * nx + ny
# 상태 변경
tmp = list(now)
tmp[zero], tmp[next_pos] = tmp[next_pos], tmp[zero]
next_state = ''.join(tmp)
# 새로운 상태를 큐에 추가
if next_state not in dic:
dic[next_state] = dic[now] + 1
q.append(next_state)
# 목표 상태에 도달하지 못한 경우
print(-1)
반응형
'백준 문제풀이 코드저장소 > Gold' 카테고리의 다른 글
Baekjoon 12100. 2048 (Easy) / Python (0) | 2024.07.01 |
---|---|
Baekjoon 12015. 가장 긴 증가하는 부분 수열 2 / Python (2) | 2024.06.30 |
Baekjoon 17387. 선분 교차 2 / Python (0) | 2024.06.30 |
Baekjoon 12100. 2048 (Easy) / Python (0) | 2024.06.30 |