PS

백준 1525. 퍼즐

tose33 2022. 9. 20. 15:14

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

 

1525번: 퍼즐

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

www.acmicpc.net

 

이 문제는 목표 상태에 도달하는 최소 횟수를 구해야 하기 때문에 bfs를 돌리면 된다.

그런데 이 문제의 핵심은 bfs의 중복 처리다. 

bfs는 중복되는 경우 큐에 넣지 않도록해서 반복되지 않도록 해줘야 한다.

 

위와 같이 주어졌을때  bfs를 돌린다고 생각하면 우선 [0][1]의 자리를 주위의 1 or 2 or 3 숫자와 자리를 바꿀것이다. 

만약 1이랑 바꾼다고 하면 다음 상태가 된다.

 

0 1 3
4 2 5
7 8 6

 

그런데 여기서 다음으로 0과 1을 다시 바꾸려고 할것이다. 

그렇게 되면 원 상태로 돌아가고 무한히 반복하게 된다.

따라서 이미 검사한 상태는 검사하지 않도록 해야 하는데 위 [3][3] 크기의 배열을 예를들어 벡터에 넣는다고 하면 벡터의 크기는 점점 커지고 검사 시간도 엄청나게 길어질것이다. 

 

이 문제는 map 자료구조를 사용하면 된다.

위 상태를 문자열로 바꿔서 map에 바꾼다. 

위 상태를 문자열로 바꾸면 "013425786" 이 될것이고 map["013425786"] = true 이런식으로 해주고, map에 해당 key값이 있으면 검사하지 않으면 된다.

 

그리고 문자열이 "123456780" 이 되면 우리가 원하는 목표값에 도달한 것이다.