[BOJ] 1525 : 퍼즐

1525 : 퍼즐

풀이

BFS

string과 map을 이용해서 9자리 숫자를 효율적으로 chk하는 방법을 배웠다.

0을 9로 바꿔주는 테크닉과 string과 map을 이용하는 방법만 알면

기본적인 bfs문제이다.

코드

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <cstring>
#include <queue>
#include <map>
#include <functional>
using namespace std;

const int n = 3;
const int dx[] = { -1,0,1,0 };
const int dy[] = { 0,1,0,-1 };

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    //0이 빈칸->편한연산을 위해 9로 바꿔준다
    int start = 0;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            int tmp;
            cin >> tmp;
            if (tmp == 0)
                tmp = 9;
            start = start * 10 + tmp;
        }
    }
    
    int ans = -1;
    //거리를 저장할것임
    map<int, int> dist;
    queue<int> q;
    q.push(start);
    //처음 거리는 0
    dist[start] = 0;
    while (!q.empty()) {
        int now_num = q.front();
        string now = to_string(now_num);
        q.pop();
        if (now_num == 123456789) {
            ans = dist[123456789];
            break;
        }

        //빈칸 찾기
        int z = now.find('9');
        int x = z / 3;
        int y = z % 3;
        for (int dir = 0; dir < 4; dir++) {
            int nx = x + dx[dir];
            int ny = y + dy[dir];
            if (nx >= 0 && nx < n&&ny >= 0 && ny < n) {
                //now가 안바뀌도록 임시변수 선언
                string next = now;
                //0의 위치와 nx,ny를 교환한다
                swap(next[x*3+y],next[nx*3+ny]);
                int num = stoi(next);
                if (dist.count(num) == 0) {
                    dist[num] = dist[now_num] + 1;
                    q.push(num);
                }
            }
        }
    }
    cout << ans;
    return 0;
}
Written on April 9, 2019