[c++] BOJ 1194 :: ๋‹ฌ์ด ์ฐจ์˜ค๋ฅธ๋‹ค ๊ฐ€์ž

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

๊ฑธ๋ฆฐ ์‹œ๊ฐ„ : ๋งŽ์ด

 

๋ฌธ์ œ

๋‹ฌ์ด ์ฐจ์˜ค๋ฅธ๋‹ค ๊ฐ€์ž ๋ฌธ์ œ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๋ฏผ์‹์ด๋Š” ์ง€๊ธˆ ๋ฏธ๋กœ ์†์— ์žˆ๋‹ค. ๋ฏธ๋กœ๋Š” ์ง์‚ฌ๊ฐํ˜• ๋ชจ์–‘์ด๊ณ , ์—ฌํ–‰๊ธธ์„ ๋– ๋‚˜๊ธฐ ์œ„ํ•ด ๋ฏธ๋กœ๋ฅผ ํƒˆ์ถœํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ๋ฏธ๋กœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌ์„ฑ๋˜์–ด์ ธ์žˆ๋‹ค.

  • ๋นˆ ๊ณณ : ์–ธ์ œ๋‚˜ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค. ('.‘๋กœ ํ‘œ์‹œ๋จ)
  • ๋ฒฝ : ์ ˆ๋Œ€ ์ด๋™ํ•  ์ˆ˜ ์—†๋‹ค. (‘#’)
  • ์—ด์‡  : ์–ธ์ œ๋‚˜ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ณณ์— ์ฒ˜์Œ ๋“ค์–ด๊ฐ€๋ฉด ์—ด์‡ ๋ฅผ ์ง‘๋Š”๋‹ค. (a - f)
  • ๋ฌธ : ๋Œ€์‘ํ•˜๋Š” ์—ด์‡ ๊ฐ€ ์žˆ์„ ๋•Œ๋งŒ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค. (A - F)
  • ๋ฏผ์‹์ด์˜ ํ˜„์žฌ ์œ„์น˜ : ๋นˆ ๊ณณ์ด๊ณ , ๋ฏผ์‹์ด๊ฐ€ ํ˜„์žฌ ์„œ ์žˆ๋Š” ๊ณณ์ด๋‹ค. (์ˆซ์ž 0)
  • ์ถœ๊ตฌ : ๋‹ฌ์ด ์ฐจ์˜ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์—, ๋ฏผ์‹์ด๊ฐ€ ๊ฐ€์•ผํ•˜๋Š” ๊ณณ์ด๋‹ค. ์ด ๊ณณ์— ์˜ค๋ฉด ๋ฏธ๋กœ๋ฅผ ํƒˆ์ถœํ•œ๋‹ค. (์ˆซ์ž 1)

๋‹ฌ์ด ์ฐจ์˜ค๋ฅด๋Š” ๊ธฐํšŒ๋ฅผ ๋†“์น˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด์„œ, ๋ฏธ๋กœ๋ฅผ ํƒˆ์ถœํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ํ•œ ๋ฒˆ์˜ ์›€์ง์ž„์€ ํ˜„์žฌ ์œ„์น˜์—์„œ ์ˆ˜ํ‰์ด๋‚˜ ์ˆ˜์ง์œผ๋กœ ํ•œ ์นธ ์ด๋™ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๋ฏผ์‹์ด๊ฐ€ ๋ฏธ๋กœ๋ฅผ ํƒˆ์ถœํ•˜๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์ด๋™ ํšŸ์ˆ˜์˜ ์ตœ์†Ÿ๊ฐ’์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

 

ํ’€์ด

  • bfs ์‚ฌ์šฉ
  • (๋ฐฉ๋ฌธํ•˜๋Š” ์œ„์น˜, ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์—ด์‡ )๊ฐ€ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋Œ€์ƒ
  • ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์—ด์‡ ๋ฅผ ๋งค๋ฒˆ ์žˆ๋Š” ์ง€ ํ™•์ธ, ์ถ”๊ฐ€ ์—ฐ์‚ฐํ•ด์•ผํ•˜๋ฏ€๋กœ ์ˆœ์„œ๊ฐ€ ์žˆ๋Š” ๋ฌธ์ž์—ด์ด ์•„๋‹Œ ์ˆœ์„œ๊ฐ€ ๊ณ ์ •๋˜์–ด ์žˆ๋Š” bitmap ์‚ฌ์šฉ
    • A-F๋Š” 6๊ฐœ์ด๋ฏ€๋กœ bitmap ์‚ฌ์šฉ์ด ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค.

 

์ฝ”๋“œ

#include <iostream>
#include <vector>
#include <string>
#include <queue>
#include <algorithm>
#include <math.h>

using namespace std;

struct Node {
    int r, c;
    int path = 0;
    int keyBitmap;
    Node(int row, int col, int pathNum, int key) {
        r = row; c = col; path = pathNum;
        keyBitmap = key;
    }
};

int N, M;
char map[51][51];
vector<int> memo[51][51]; // A-F๋Š” 6๊ฐœ => 6์ž๋ฆฌ์˜ ์ˆ˜๋กœ ํ‘œํ˜„
Node* start;
int direction[4][2] = { {0,1}, {-1, 0}, {1, 0}, {0, -1} };

int main() {
    // bfs

    int POWARR[6];
    for (int i = 0; i < 6; i++) // ๋ฏธ๋ฆฌ pow ์ €์žฅ
        POWARR[i] = pow(10, i);

    cin >> N >> M;

    for (int i = 0; i < N; i++) {
        string str;
        cin >> str;
        for (int j = 0; j < M; j++) {
            map[i][j] = str[j];
            if (map[i][j] == '0') { // char๋กœ ๋ฐ›์„ ๋•Œ ์ฃผ์˜!
                start = new Node(i, j, 0, 0);
            }
        }
    }

    fill(&memo[0][0], &memo[50][50], vector<int>()); // ํ‚ค ์ €์žฅ

    int res = 1e8;

    queue<Node*> que;
    que.push(start);
    memo[start->r][start->c].push_back(start->keyBitmap);

    while (!que.empty()) {
        Node* pos = que.front(); que.pop();
        for (int i = 0; i < 4; i++) {
            int r = pos->r + direction[i][0];
            int c = pos->c + direction[i][1];
            int path = pos->path + 1;
            int key = pos->keyBitmap;
            if (r < 0 || c < 0 || r >= N || c >= M) // ๋งต ๋ฐ–์— ์œ„์น˜
                continue;
            if (map[r][c] == '1') { // ํƒˆ์ถœ
                cout << path;
                return 0;
            }
            if (memo[r][c].size()) { // ์ด๋ฏธ ๊ฐ™์€ ํ‚ค๋ฅผ ๊ฐ€์ง€๊ณ  ๋“ค๋ฆ„
                if (find(memo[r][c].begin(), memo[r][c].end(), key) != memo[r][c].end())
                    continue;
            }
            if (map[r][c] == '#') // ๋ฒฝ
                continue;
            if (map[r][c] >= 'A' && map[r][c] <= 'F') {
                int index = map[r][c] - 'A';
                if((int)(key / POWARR[index]) % 10 == 0)
                    continue;
            }
            if (map[r][c] >= 'a' && map[r][c] <= 'f') {
                int index = map[r][c] - 32 - 'A';
                if ((int)(key / POWARR[index]) % 10 == 0)
                    key += POWARR[index];
            }
            que.push(new Node(r, c, path, key));
            if (find(memo[r][c].begin(), memo[r][c].end(), key) == memo[r][c].end())
                memo[r][c].push_back(key);
        }
    }
    cout << -1;
}

 

 

์ฃผ์˜ํ•  ์ 

  • ์ž…๋ ฅ๊ฐ’์„ string์œผ๋กœ ๋ฐ›์„ ๋•Œ ์กฐ๊ฑด ์ฒ˜๋ฆฌ๋ฅผ char ํ˜•์œผ๋กœ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

 

๊ฒฐ๊ณผ

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