[C++]백준2589번 보물섬

1 minute read

오늘은 백준2589번 보물섬 문제를 풀어보도록 하자.

BFS문제로 큐의 턴 관리가 중요했던 문제다. 최단 거리로 이동하는 시간을 구해야하므로 BFS로 구현을 하였다.

문제는 다음과 같다.

                               [접근법]

  1. 만일 map이 L이면 bfs 돌린다.

  2. 이 때 중요한건 큐 사이즈 만큼 돌려줘야한다는 것이다. 왜냐하면 큐 사이즈만큼 돌려주지 않으면 최단거리가 아님에도 불구하고 cnt값을 증가시키기 때문에
  원하는 이동 시간을 얻을 수 없다.
                                     [코드]
#include <iostream>
#include <queue>
using namespace std;
char map[50][50];
bool visit[50][50];
int dir[4][2] = { {-1,0}, {0,1},{1,0},{0,-1} };
int R, C, answer = 0;
struct pos {
	int y;
	int x;
};
queue<pos>Q;

void Init_visit() {
	for (int i = 0; i < R; i++) {
		for (int j = 0; j < C; j++) {
			visit[i][j] = false;
		}
	}
}

bool Inbound(int y, int x) {
	if (y >= 0 && y < R && x >= 0 && x < C) {
		return true;
	}
	return false;
}

void bfs() {
	int cnt = 0;
	while (!Q.empty()) {
		int size_of_Q = Q.size();

		for (int j = 0; j < size_of_Q; j++) {
			int y = Q.front().y;
			int x = Q.front().x;

			Q.pop();

			for (int i = 0; i < 4; i++) {
				int my = y + dir[i][0];
				int mx = x + dir[i][1];

				if (Inbound(my, mx)) {
					if (!visit[my][mx] && map[my][mx] == 'L') {
						Q.push({ my,mx });
						visit[my][mx] = true;
					}
				}
			}
		}
		cnt++;
	}
	if (answer < cnt) {
		answer = cnt;
	}
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin >> R >> C;

	for (int i = 0; i < R; i++) {
		for (int j = 0; j < C; j++) {
			cin >> map[i][j];
		}
	}

	for (int i = 0; i < R; i++) {
		for (int j = 0; j < C; j++) {
			if (map[i][j] == 'L') {
				Q.push({ i,j });
				visit[i][j] = true;
				bfs();
				Init_visit();
			}
		}
	}
	cout << answer - 1 << '\n';
}