코딩무비

[백준] 1525번 퍼즐 (python 파이썬)

by 코딩무비
반응형

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

 

1525번: 퍼즐

세 줄에 걸쳐서 표에 채워져 있는 아홉 개의 수가 주어진다. 한 줄에 세 개의 수가 주어지며, 빈 칸은 0으로 나타낸다.

www.acmicpc.net

 

- 퍼즐 / 골드2 / 82분

 

 

생각해보아야 할 것

1. 어떤 수를 옮겨야 하는가?

- 0을 기준으로 상하좌우에 있는 수를 옮김

- 이 때, 바꾼 수와 기존의 수를 스와핑

nx ,ny = x+dx,y+dy
if 0<=nx<3 and 0<=ny <3 :
    n_p = puzzles[:]
    n_p = list(n_p)
    n_p[3*nx+ny],n_p[3*x+y] = n_p[3*x+y] ,n_p[3*nx+ny]

 

2. 방문은 어떻게 구현해야 하는가?

- 해당 그래프를 문자열로 변환 뒤 딕셔너리에 추가

- 딕셔너리 키에 존재하지 않는 경우 큐에 추가

import sys
input = sys.stdin.readline
from collections import deque


def bfs():

    while Q:
        (x,y),puzzles,cnt = Q.popleft()
        if puzzles == answer:
            return cnt

        for dx,dy in zip(X,Y):
            nx ,ny = x+dx,y+dy
            if 0<=nx<3 and 0<=ny <3 :
                n_p = puzzles[:]
                n_p = list(n_p)
                n_p[3*nx+ny],n_p[3*x+y] = n_p[3*x+y] ,n_p[3*nx+ny]
                str_l = ''.join(n_p)
                if not visited_dict.get(str_l):
                    visited_dict[str_l] = 1
                    Q.append(((nx,ny),str_l,cnt+1))
    return -1


G =""
for _ in range(3):
    row = input().split()
    row = ''.join(row)
    G+=row

visited_dict = {}

Q = deque()
X = [0,0,-1,1]
Y = [-1,1,0,0]
answer = "123456780"
for i in range(9):
    if G[i] == '0':
        zero_idx = i
        break
Q.append(((zero_idx//3,zero_idx%3),G,0))
print(bfs())

 

 

반응형

블로그의 정보

코딩무비

코딩무비

활동하기