문제 https://www.acmicpc.net/problem/1525
풀이
1. 단순히 생각하면 퍼즐 단계 단계 BFS로 탐색하면 되지만, 3X3배열을 저장해놓아야 한다는 메모리적인 부담이 있다.
이 문제는 메모리제한이 32MB이기 때문에 배열을 저장하는 것은 옳지 않다.
그래서 생각해낸것이 string으로 저장하는 것이다.
결국에는 이 문자열이 "123456780"이 되면 펴즐이 완성이 되는 것이다.
2. 큐에 현재문자열과 걸린 시간을 저장한다. 현재 문자열에 대해서 이제 처리를 하면되는데,
관건은 0의 위치다. 0의 상하좌우에 있는 숫자들은 0으로 이동할 수 있기 때문이다.
string에 있는 find함수로 '0'을 찾고, 상하좌우를 탐색해주기 위해서 3X3배열일때 0의 (x, y)좌표를 계산을 통해 찾는다.
x=0의 위치 / 3이고, y=0의 위치 % 3 이다.
3. set<string>을 써서 탐색한 퍼즐에 대해서 또 탐색하지 않도록
set에 현재문자열이 있는지 체크하고 없으면 set에 문자열을 넣어둔다.
4. 큐를 빠져나와도 목적을 찾지 못하면 -1을 출력한다.
코드 https://github.com/ziwonii24/Algorithm/blob/master/Baekjoon/1525.cpp
결과
'알고리즘 문제풀이 > 알고리즘 C++ 풀이' 카테고리의 다른 글
[백준] 1261번: 알고스팟 (C++ 풀이) (0) | 2019.04.02 |
---|---|
[백준] 1389번: 케빈 베이컨의 6단계 법칙 (C++ 풀이) (0) | 2019.04.02 |
[백준] 9019번: DSLR (C++ 풀이) (0) | 2019.04.01 |
[백준] 2636번: 치즈 (C++ 풀이) (0) | 2019.04.01 |
[백준] 2644번: 촌수계산 (C++ 풀이) (0) | 2019.03.31 |