본문 바로가기
백준

[백준 1525] 퍼즐, C++

by 황인태(intaehwang) 2020. 3. 9.
반응형

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

 

1525번: 퍼즐

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

www.acmicpc.net

본 문제는 지금까지 풀었던 BFS와 저장과 확인 방식의 차이가 있어 글을 쓰게 되었다. 그 동안 BFS는 2차원 배열로 정보를 저장하여 최단 거리를 구했는데 이 문제는 string과 set을 이용하여 최단 거리를 구하였다. 실제 코딩 테스트나 시험에 나왔으면 많이 당황할 문제라고 생각한다.

설명은 주석 처리를 하였다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <iostream>
#include <queue>
#include <set>
#include <string>
#include <algorithm>
 
using namespace std;
 
int dx[] = {1-100};
int dy[] = {001-1};
 
int main() {
    // 퍼즐의 상태를 string으로 저장한다.
    string s = "";
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            char tmp;
            cin >> tmp;
            s += tmp;
        }
    }
    set<string> chk;
    queue<pair<stringint>> q;
    chk.insert(s);
    q.push(make_pair(s, 0));
 
    int ans = -1;
 
    while (!q.empty()) {
        string now = q.front().first;
        int cnt = q.front().second;
        q.pop();
        // 목표에 도달하였는지 확인
        if (now == "123456780") {
            if (ans == -1 || ans > cnt) ans = cnt; 
        }
        // string에서 0의 위치를 찾는다.
        int start = now.find('0');
 
        // 0의 위치를 2차원으로 표현한다.
        int x = start / 3;
        int y = start % 3;
 
        for (int k = 0; k < 4; k++) {
            int nx = x + dx[k];
            int ny = y + dy[k];
            if (nx >= 0 && nx < 3 && ny >= 0 && ny < 3) {
                string next = now;
 
                // 2차원으로 표현된 값을 1차원으로 변경
                swap(next[x*3+y], next[nx*3+ny]);
 
                // 방문한 경험이 있는지 확인
                if (chk.find(next) == chk.end()) {
 
                    // 없으면 set에 저장
                    chk.insert(next);
                    q.push(make_pair(next, cnt+1));
                }
            }
        }
    }
    cout << ans << "\n";
}
cs
반응형

'백준' 카테고리의 다른 글

[백준 16926] 배열 돌리기 1, C++  (0) 2020.03.12
[백준 16234] 인구 이동, C++  (0) 2020.03.10
[백준 11051] 이항 계수 2, C++  (0) 2020.03.08
[백준 12358] 시험 감독, C++  (0) 2020.03.03
[백준 1038] 감소하는 수, C++  (0) 2020.03.02
Buy me a coffeeBuy me a coffee

댓글