[๋ฐฑ์ค/C++] 1194. ๋ฌ์ด ์ฐจ์ค๋ฅธ๋ค, ๊ฐ์
๋ฌธ์
https://www.acmicpc.net/problem/1194
0์์ ์ถ๋ฐํ์ฌ 1๊น์ง ๊ฐ ์ ์๋ ์ต๋จ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์ด๋ค.
#์ ์ง๋๊ฐ ์ ์๊ณ , a~f๋ ์ด์ , A~F๋ ๋ฌธ์ด๋ฉฐ ๊ฐ ๋ฌธ์ ์ง๋๊ธฐ ์ํด์๋ ํด๋นํ๋ ์๋ฌธ์ ์ด์ ๋ฅผ ๊ฐ์ง๊ณ ์์ด์ผํ๋ค.
ํ์ด
์ด์ ์ ๋ฌธ์ด๋ผ๋ ์์๊ฐ ์ถ๊ฐ๋๊ธฐ๋ ํ์ง๋ง, ๊ธฐ๋ณธ์ ์ผ๋ก๋ BFS๋ฅผ ์ด์ฉํ์ฌ ์ต๋จ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ๋ฌธ์ ์ด๋ค.
๊ตฌ์กฐ์ฒด๋ฅผ ๋ง๋ค์ด์ BFS๋ฅผ ๋๋ฆฌ๋๊ฒ ๊น์ง๋ ๋น๊ต์ ์ผ๋ก ๊ธ๋ฐฉ ํ ์ ์์๋๋ฐ, ๋ฉ๋ชจ๋ฆฌ์ด๊ณผ๊ฐ ๋ฌ๋ค.
visited๋ฐฐ์ด์ visited[2][2][2][2][2][2][51][51]๋ก ๋ง๋ค๊ณ , ๊ตฌ์กฐ์ฒด์ 6์นธ์ง๋ฆฌ vector๋ฅผ ๋ฃ์ด์ ๊ทธ๋ฐ ๊ฒ ๊ฐ์๋ค.
๊ฒ์์ ํด๋ณด๋, ์ด์ ๊ด๋ จ ๋ถ๋ถ์ "๋นํธ๋ง์คํน"์ผ๋ก ํด๊ฒฐํด์ผ ํ๋ ๋ฌธ์ ์๋ค.
๋ฐ๋ผ์ visited๋ฐฐ์ด์ visited[51][51][64] ๋ก ๋ฐ๊พธ๊ณ , ๊ตฌ์กฐ์ฒด์ key๊ด๋ จ ๋ณ์๋ฅผ ๊ทธ๋ฅ int๋ก ๋ฐ๊ฟจ๋๋ ํต๊ณผ๋์๋ค.
* key๊ฐ a~f๊น์ง 6์ข ๋ฅ์ด๊ธฐ ๋๋ฌธ์, 111111(2) = 63์ด๋ค. ๋ฐ๋ผ์ key๊ฐ์ง์๋ 0~63์ 64๊ฐ์ง ์ด๋ค.
์ด์ ๋ฅผ ์ป์๋๋ | (OR) ์ฐ์ฐ์ ์ด์ฉํด key์ ํด๋น ์ด์ ๋ฅผ ์ถ๊ฐํ์๊ณ ,
๋ฌธ์ ์ด ๋๋ & (AND) ์ฐ์ฐ์ ์ด์ฉํด์ ํด๋น ์ด์ ๊ฐ ์กด์ฌํ๋์ง ํ์ธํ์๋ค.
1 << 1 : a์ด์
1 << 2 : b์ด์
1 << 3 : c์ด์
1 << 4 : d์ด์
1 << 5 : e์ด์
1 << 6 : f์ด์
์ฝ๋
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
int N, M;
char map[51][51];
bool visited[51][51][1 << 6] = { 0, }; //1 << 6 -> 2์ง์ 111111 -> 64
int dn[4] = { -1,1,0,0 };
int dm[4] = { 0,0,-1,1 };
struct Node {
int n;
int m;
int count;
int keys;
};
int BFS(int startN, int startM) {
queue<Node> q;
q.push({ startN, startM, 0, 0 });
visited[startN][startM][0] = 1;
while (!q.empty()) {
int tempN = q.front().n;
int tempM = q.front().m;
int count = q.front().count;
int keys = q.front().keys;
q.pop();
for (int i = 0;i < 4;i++) {
int nextN = tempN + dn[i];
int nextM = tempM + dm[i];
if (nextN < 0 || nextN >= N || nextM < 0 || nextM >= M) continue;
if (map[nextN][nextM] == '#') continue; //๋ฒฝ
if (!visited[nextN][nextM][keys]) {
if (map[nextN][nextM] == '1') // ์ถ๊ตฌ
return count + 1;
if (map[nextN][nextM] >= 'a' && map[nextN][nextM] <= 'f') { // ์ด์
int newkeys = keys | (1 << (int)(map[nextN][nextM] - 'a'));
visited[nextN][nextM][newkeys] = 1;
q.push({ nextN, nextM, count + 1, newkeys });
}
else if (map[nextN][nextM] >= 'A' && map[nextN][nextM] <= 'F') { // ๋ฌธ
if ((keys & (1 << (int)(map[nextN][nextM] - 'A'))) == 0) continue;
q.push({ nextN, nextM, count + 1, keys });
visited[nextN][nextM][keys] = 1;
}
else { // ๋น ๊ณณ, ์ถ๋ฐ์ง ์ฌ ๋ฐฉ๋ฌธ
q.push({ nextN, nextM, count + 1, keys });
visited[nextN][nextM][keys] = 1;
}
}
}
}
return -1;
}
int main(void) {
cin >> N >> M;
int startN, startM;
for (int n = 0;n < N;n++) {
for (int m = 0;m < M;m++) {
cin >> map[n][m];
if (map[n][m] == '0') {
startN = n;
startM = m;
}
}
}
int result = BFS(startN, startM);
cout << result << endl;
return 0;
}
๊ฒฐ๊ณผ
์ฐธ๊ณ
๋นํธ๋ง์คํฌ ์์ด๋์ด๋ฅผ ์ป์ ์ ์์๋ค !