๋์ด๋ : ๊ณจ๋ 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 |
๋ฐ์ํ
'Algorithm ๋ฌธ์ > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[c++] BOJ 5052 :: ์ ํ๋ฒํธ ๋ชฉ๋ก (0) | 2021.07.03 |
---|---|
[c++] BOJ 1600 :: ๋ง์ด ๋๊ณ ํ ์์ญ์ด (0) | 2021.06.25 |
[c++] BOJ 2250 :: ํธ๋ฆฌ์ ๋์ด์ ๋๋น (0) | 2021.06.02 |
[c++] BOJ 1525 :: ํผ์ฆ (0) | 2021.05.26 |
[c++] BOJ 9019 :: DSLR (0) | 2021.05.26 |
Comment