Hello Ocean! ๐ŸŒผ

[๋ฐฑ์ค€/C++] 2206. ๋ฒฝ ๋ถ€์ˆ˜๊ณ  ์ด๋™ํ•˜๊ธฐ ๋ณธ๋ฌธ

Algorithm

[๋ฐฑ์ค€/C++] 2206. ๋ฒฝ ๋ถ€์ˆ˜๊ณ  ์ด๋™ํ•˜๊ธฐ

bba_dda 2021. 5. 12. 19:23
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ

www.acmicpc.net/problem/2206

 

2206๋ฒˆ: ๋ฒฝ ๋ถ€์ˆ˜๊ณ  ์ด๋™ํ•˜๊ธฐ

N×M์˜ ํ–‰๋ ฌ๋กœ ํ‘œํ˜„๋˜๋Š” ๋งต์ด ์žˆ๋‹ค. ๋งต์—์„œ 0์€ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ์„ ๋‚˜ํƒ€๋‚ด๊ณ , 1์€ ์ด๋™ํ•  ์ˆ˜ ์—†๋Š” ๋ฒฝ์ด ์žˆ๋Š” ๊ณณ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๋‹น์‹ ์€ (1, 1)์—์„œ (N, M)์˜ ์œ„์น˜๊นŒ์ง€ ์ด๋™ํ•˜๋ ค ํ•˜๋Š”๋ฐ, ์ด๋•Œ ์ตœ๋‹จ ๊ฒฝ๋กœ

www.acmicpc.net

ํ’€์ด

์†Œ์š”์‹œ๊ฐ„ : 2์‹œ๊ฐ„ 
BFS๋ฅผ ์ด์šฉํ•ด์„œ ํ’€์—ˆ๋‹ค.

๊ตฌ์กฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์„œ ํ์— ๋„ฃ์—ˆ๋‹ค.

๋ฐฉ๋ฌธ์—ฌ๋ถ€๋ฅผ ๊ฒ€์‚ฌํ•  ๋•Œ, ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜๊ธฐ ์ „์— ๋ฒฝ์„ ๋ถ€์‹ ์ ์ด ์žˆ๋Š”์ง€ ์—†๋Š”์ง€๋ฅผ ๊ตฌ๋ณ„ํ•ด์„œ ๊ฒ€์‚ฌํ–ˆ๋‹ค. 

 

์ฝ”๋“œ

/* ๋ฒฝ ๋ถ€์ˆ˜๊ณ  ์ด๋™ํ•˜๊ธฐ */
#include <iostream>
#include <queue>
#include <algorithm>
#include <string>

using namespace std;

int N, M;
bool map[1001][1001];
bool visited[2][1001][1001] = { 0, };
int answer = 987654321;
int dn[4] = { -1,1,0,0 };
int dm[4] = { 0,0,-1,1 }; // ์ƒ ํ•˜ ์ขŒ ์šฐ

struct Node {
	int n;
	int m;
	int dist;
	bool crashWall;
};
void BFS() {
	queue<Node> q;
	q.push({1,1,1,0}); // idx : 1 ~ N, 1 ~ M 
	visited[1][1][1] = 1;
	visited[0][1][1] = 1;

	while (!q.empty()) {
		Node temp = q.front();
		int n = temp.n;
		int m = temp.m;
		int dist = temp.dist;
		bool crashWall = temp.crashWall;
		q.pop();
		if (n == N && m == M) {
			answer = dist;
			return;
		}
		for (int i = 0;i < 4;i++) {
			int new_n = n + dn[i];
			int new_m = m + dm[i];
			
			if (new_n > 0 && new_n <= N && new_m > 0 && new_m <= M) { //map ๋ฒ”์œ„ ์•ˆ์ธ์ง€ ํ™•์ธ
				if (map[new_n][new_m]) { //๋ฒฝ
					if (!crashWall && !visited[!crashWall][new_n][new_m]) { //๋ฒฝ์„ ๋ถ€์‹ ์ ์ด ์—†๊ณ , ํ•ด๋‹น ์œ„์น˜๋ฅผ ๋ฒฝ์„ ๋ถ€์‹ ์ฑ„๋กœ ๋ฐฉ๋ฌธํ•œ ์ ์ด ์—†์œผ๋ฉด 
						q.push({ new_n,new_m,dist + 1,!crashWall });
						visited[!crashWall][new_n][new_m] = 1;
					}
				}
				else { //๋ฒฝ์ด ์•„๋‹˜ 
					if (!visited[crashWall][new_n][new_m]) {
						q.push({ new_n,new_m,dist + 1,crashWall });
						visited[crashWall][new_n][new_m] = 1;
					}
						
				}
			}
		}
	}
}
int main(void) {
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	cin >> N >> M;
	string s;
	for (int i = 1;i <= N;i++) {
		cin >> s;
		for (int j = 1;j <= M;j++) {
			map[i][j] = s[j-1] - '0';
		}
	}
	BFS();
	if (answer == 987654321)
		answer = -1;
	cout << answer << endl;
	return 0;
}

๊ฒฐ๊ณผ 

 

 

๋ฌด์ˆ˜ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ณผ์˜ ๊ธฐ๋ก...

-> BFS์—์„œ q์— pushํ•  ๋•Œ, visited๋ฅผ ์ฒดํฌํ•ด์ค˜์•ผ ํ•˜๋Š”๋ฐ, q์—์„œ ๊บผ๋‚ด๊ณ  ๋‚˜์„œ ์ฒดํฌํ–ˆ๋”๋‹ˆ ๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ณผ๊ฐ€ ๋‚ฌ๋‹ค.. 

 

๋ฐ˜์‘ํ˜•