PS (C, C++)

[백준/C++] 9205 맥주 마시면서 걸어가기

최연재 2024. 11. 18. 21:24

https://www.acmicpc.net/problem/9205

코드

#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;

#define MAX 101
#define CAN_MOVE 1000
#define FASTIO ios::sync_with_stdio(false); cin.tie(NULL);
typedef pair<int, int> pi;
int t, n;
bool visit[MAX];
pi h, f;
vector<pi> store;

bool bfs() {
	queue<pi>q;
	q.push(h);

	while (!q.empty()) {
		int nx = q.front().first;
		int ny = q.front().second;
		q.pop();

		if (abs(f.first - nx) + abs(f.second - ny) <= CAN_MOVE)
			return true;

		for (int i = 0; i < n; i++) {
			if (visit[i]) continue;
			if (abs(store[i].first - nx) + abs(store[i].second - ny) <= CAN_MOVE) {
				visit[i] = true;
				q.push(store[i]);
			}
		}
	}
	return false;
}

int main() {
	FASTIO;
	cin >> t;
	while (t--) {
		cin >> n;
		store.resize(n);
		cin >> h.first >> h.second;

		for (int i = 0; i < n; i++) {
			cin >> store[i].first >> store[i].second;
		}

		cin >> f.first >> f.second;

		if (bfs()) cout << "happy\n";
		else cout << "sad\n";
		memset(visit, false, sizeof(visit));
	}
	return 0;
}

설명

처음에는 상근이의 집에서 시작하고, 편의점을 방문하면서 페스티벌 장소까지 맥주를 마시며 갈 수 있는지 확인하는 문제입니다. BFS를 통해 문제를 해결할 수 있습니다.

 

먼저 큐에는 상근이의 현재 위치를 넣어줍니다. 거리는 맨해튼 거리이기 때문에 X 좌표와 Y 좌표의 차이를 이용하고, 50미터 당 맥주 한 병을 마실 수 있으므로 집 혹은 편의점을 나서면 1000미터까지 이동할 수 있습니다. 현재 위치에서 1000미터 내에 페스티벌 장소가 있으면 바로 true를 리턴하고, 그렇지 않으면 방문하지 않은 편의점에 대해서 위치 상 방문 가능한지 확인합니다. 방문이 가능하면 다시 맥주를 구매할 수 있으므로 큐에 넣어줍니다.

 

return 값에 따라 happy 혹은 sad를 출력합니다.

 

느낀 점

평소에 풀던 bfs와 약간 다른 느낌이라 새로웠습니다.