[BOJ] 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