[c++] BOJ 1525 :: ํผ์ฆ

๋‚œ์ด๋„ : ๊ณจ๋“œ 2

๊ฑธ๋ฆฐ ์‹œ๊ฐ„ : 1์‹œ๊ฐ„

 

๋ฌธ์ œ

ํผ์ฆ ๋ฌธ์ œ ๋ฐ”๋กœ๊ฐ€๊ธฐ

3×3 ํ‘œ์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜๊ฐ€ ์ฑ„์›Œ์ ธ ์žˆ๋‹ค. ์˜ค๋ฅธ์ชฝ ์•„๋ž˜ ๊ฐ€์žฅ ๋ ์นธ์€ ๋น„์–ด ์žˆ๋Š” ์นธ์ด๋‹ค.

1 2 3
4 5 6
7 8  

์–ด๋–ค ์ˆ˜์™€ ์ธ์ ‘ํ•ด ์žˆ๋Š” ๋„ค ๊ฐœ์˜ ์นธ ์ค‘์— ํ•˜๋‚˜๊ฐ€ ๋น„์–ด ์žˆ์œผ๋ฉด, ์ˆ˜๋ฅผ ๊ทธ ์นธ์œผ๋กœ ์ด๋™์‹œํ‚ฌ ์ˆ˜๊ฐ€ ์žˆ๋‹ค. ๋ฌผ๋ก  ํ‘œ ๋ฐ”๊นฅ์œผ๋กœ ๋‚˜๊ฐ€๋Š” ๊ฒฝ์šฐ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ์šฐ๋ฆฌ์˜ ๋ชฉํ‘œ๋Š” ์ดˆ๊ธฐ ์ƒํƒœ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ตœ์†Œ์˜ ์ด๋™์œผ๋กœ ์œ„์™€ ๊ฐ™์€ ์ •๋ฆฌ๋œ ์ƒํƒœ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค.

 

ํ’€์ด

  • ์ตœ๋‹จ ๊ฒฝ๋กœ ๋ฌธ์ œ์ด๋ฏ€๋กœ bfs ์ด์šฉ
  • memo ํ•ด์•ผ ๋˜‘๊ฐ™์€ ๊ฒฝ๋กœ ๋‹ค์‹œ ํƒ์ƒ‰ x
    • memo๋Š” ์ „์ฒด map์˜ ์ƒํƒœ๋ฅผ ์ €์žฅํ•ด์•ผํ•จ
    • string์œผ๋กœ ์ €์žฅ

 

์ฝ”๋“œ

#include <iostream>
#include <string>
#include <unordered_set>
#include <algorithm>
#include <queue>

using namespace std;

int map[10];
unordered_set<string> memo;
int direction[9][4] = { {-1,1,3,-1}, {-1,2,4,0}, {-1,-1,5,1}, {0,4,6,-1}, {1,5,7,3}, {2,-1,8,4}, {3,7,-1,-1}, {4,8,-1,6}, {5,-1,-1,7} };

struct Node {
    int zero;
    string mapstring;
    int move = 0;
    Node(int z, string s, int m) {
        zero = z;
        mapstring = s;
        move = m;
    }
};

int main() {
    int zero = -1;
    string mapString = "";
    for (int i = 0; i < 9; i++) {
            string tmp = "";
            cin >> tmp;
            mapString += tmp;
            if (tmp == "0")
                zero = i;

    }
    if (mapString == "123456780") {
        cout << 0;
        return 0;
    }
    queue<Node*> que;
    que.push(new Node(zero, mapString, 0)); memo.insert(mapString);
    while (!que.empty()) {
        Node* z = que.front(); que.pop();
        for (int i = 0; i < 4; i++) {
            if (direction[z->zero][i] == -1)
                continue;
            int zeroSpot = z->zero; string tmpMapString = z->mapstring; int tmpMove = z->move +1;
            int newZero = direction[z->zero][i];
            tmpMapString[z->zero] = tmpMapString[newZero];
            tmpMapString[newZero] = '0';

            if (tmpMapString == "123456780") { // ์ •๋‹ต
                cout << tmpMove;
                return 0;
            }

            auto pos = memo.find(tmpMapString);
            if (pos != memo.end())// memo์— ์žˆ๋‹ค๋ฉด (๋ฐฉ๋ฌธ ํ–ˆ๋˜ ๊ณณ์ด๋ฉด)
                continue;

            que.push(new Node(newZero, tmpMapString, tmpMove));
            memo.insert(tmpMapString);
        }
    }
    cout << -1;
}

memo๋Š” unordered_set์„ ์ด์šฉํ•ด์„œ string์œผ๋กœ ํŒ๋‹จ

 

์ฃผ์˜ํ•  ์ 

  • dfs๋กœ ํ•˜๋ฉด ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ
  • ์ฒ˜์Œ์— ์ •๋‹ต์ด ๋„˜์–ด์˜ค๋Š” ๊ฒฝ์šฐ 0์„ ์ถœ๋ ฅํ•ด์ฃผ์–ด์•ผ ํ•จ

 

๊ฒฐ๊ณผ

์•„์ด๋”” ๋ฉ”๋ชจ๋ฆฌ ์‹œ๊ฐ„ ์–ธ์–ด ์ฝ”๋“œ ๊ธธ์ด
gmldms784 27780 192 C++17 / ์ˆ˜์ • 2553
๋ฐ˜์‘ํ˜•