๋ฌธ์ |
1525๋ฒ: ํผ์ฆ
์ธ ์ค์ ๊ฑธ์ณ์ ํ์ ์ฑ์์ ธ ์๋ ์ํ ๊ฐ์ ์๊ฐ ์ฃผ์ด์ง๋ค. ํ ์ค์ ์ธ ๊ฐ์ ์๊ฐ ์ฃผ์ด์ง๋ฉฐ, ๋น ์นธ์ 0์ผ๋ก ๋ํ๋ธ๋ค.
www.acmicpc.net
ํ์ด |
๋ถ๋ฅ : ์์ ํ์
0๋ง 3x3 ์์น๋ก ์ฎ๊ธฐ๋๊ฒ ์๋๋ผ, ํผ์ฆํ๊น์ง
1 2 3
4 5 6
7 8 0
์์ผ๋ก ๋ง์ถฐ์ผ ํ๋ ๊ฒ์ด ์ด ๋ฌธ์ ์ ํต์ฌ์ด์์ต๋๋ค. + bfs
๊ฒฐ๊ตญ ์ ๋ ฅ๊ฐ์ 123456780์ ์์๋ก ๋ง๋ค์ ์๋์ง๋ฅผ ์ฒดํฌํ๋ฉด ๋์์ต๋๋ค.
1. ์ ๋ ฅ๊ฐ์ string ๋ฌธ์์ด๋ก ์ด๊ธฐํํ๋, 0์ 9๋ก ์นํํด์ค๋๋ค.
2. ์ฒ์ ์ ๋ ฅ๋ฐ์ ๋ฌธ์์ด์ ํ์ ๋ฃ์ด์ค๋๋ค.
3. ํ์์ popํ ๋ฌธ์์ด์์ 9์ ์์น๋ฅผ ์ฐพ๊ณ , 9์ ์ํ์ข์ฐ๋ฅผ ์ค์ํฉ๋๋ค.
4. ์ค์์ผ๋ก ์๋ก ๋ง๋ค์ด์ง string๋ฌธ์์ด์ด, ์บ์์ key๋ก ์ด๋ฏธ ๋ฑ๋ก๋์ด์๋์ง ์ฒดํฌํฉ๋๋ค.
5. ๋ฑ๋ก๋์ง ์์ ๊ฒฝ์ฐ, ์๋ก ๋ง๋ค์ด์ง string๋ฌธ์์ด์ ๋ค์ ํ์ ๋ฃ์ต๋๋ค.
6. while(!q.empty())์ผ๋๊น์ง ๋ฐ๋ณต.
์ฝ๋(O(nm)) *O(nm)์ด ์๋๋ผ๋ฉด ์๋ ค์ฃผ์ธ์. ๊ฐ์ฌํฉ๋๋ค(--)(__)* |
#include <iostream> | |
#include <map> | |
#include <queue> | |
#include <algorithm> | |
#include <string> | |
#define WH 3 | |
#define MAX 9 | |
using namespace std; | |
int dir[4][2] = { {-1,0},{1,0},{0,-1},{0,1} }; | |
string TARGET = "123456789"; | |
int main() { | |
int p[WH][WH]; | |
string chk; | |
for (int i = 0; i < WH; i++) { | |
for (int j = 0; j < WH; j++) { | |
cin >> p[i][j]; | |
if (p[i][j] == 0) p[i][j] = 9; | |
chk += to_string(p[i][j]); | |
} | |
} | |
queue<string> q; | |
map<string, int> visited; | |
q.push(chk); | |
visited[chk] = 0; | |
while (!q.empty()) { | |
string curChk = q.front(); | |
q.pop(); | |
if (curChk == TARGET) break; | |
else { | |
int empty = curChk.find('9');//9์์น ์ฐพ์ | |
int x = empty/3, y = empty%3; | |
for (int i = 0; i < 4; i++) {//์ํ์ข์ฐ ์์ง์ผ์ ์๋๊ณณ ์ฐพ์ | |
int nx = x + dir[i][0], ny = y + dir[i][1]; | |
if (nx >= 0 && nx < WH && ny >= 0 && ny < WH) { | |
//9์์ ์์น์ ์ค์ | |
string temp = curChk; | |
swap(temp[x*3+y], temp[nx*3+ny]); | |
//map์ ์ด๋ฏธ temp๊ฐ ์๋์ง ํ์ธ, ์์ผ๋ฉด ํ์ ์ถ๊ฐ | |
if (!visited.count(temp)) { | |
visited[temp] = visited[curChk] + 1; | |
q.push(temp); | |
} | |
} | |
} | |
} | |
} | |
if (!visited.count(TARGET)) cout << -1 << endl; | |
else cout << visited[TARGET] << endl; | |
return 0; | |
} |
'๐ค PS(Problem Solving) > ๋ฐฑ์ค(BOJ)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค/c++] 10610๋ฒ - 30 (0) | 2019.11.14 |
---|---|
[๋ฐฑ์ค/c++] 10971๋ฒ - ์ธํ์ ์ํ2 (0) | 2019.11.13 |
[๋ฐฑ์ค/c++] 17298๋ฒ - ์คํฐ์ (0) | 2019.11.02 |
[๋ฐฑ์ค/c++] 1021๋ฒ - ํ์ ํ๋ ํ (0) | 2019.11.02 |
[๋ฐฑ์ค/c++] 10866๋ฒ - ๋ฑ (0) | 2019.11.02 |