Algorithm

[๋ฐฑ์ค€/C++] 1194. ๋‹ฌ์ด ์ฐจ์˜ค๋ฅธ๋‹ค, ๊ฐ€์ž

bba_dda 2021. 6. 2. 21:49
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ

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;
}

๊ฒฐ๊ณผ

์ฐธ๊ณ 

๋น„ํŠธ๋งˆ์Šคํฌ ์•„์ด๋””์–ด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค !

https://j2wooooo.tistory.com/39

๋ฐ˜์‘ํ˜•