어흥

[백준 9205] 맥주 마시면서 걸어가기 (C++) 본문

알고리즘/백준

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

라이언납시오 2020. 3. 6. 16:06
728x90
반응형

문제 링크: https://www.acmicpc.net/problem/9205

 

9205번: 맥주 마시면서 걸어가기

문제 송도에 사는 상근이와 친구들은 송도에서 열리는 펜타포트 락 페스티벌에 가려고 한다. 올해는 맥주를 마시면서 걸어가기로 했다. 출발은 상근이네 집에서 하고, 맥주 한 박스를 들고 출발한다. 맥주 한 박스에는 맥주가 20개 들어있다. 목이 마르면 안되기 때문에 50미터에 한 병씩 마시려고 한다. 상근이의 집에서 페스티벌이 열리는 곳은 매우 먼 거리이다. 따라서, 맥주를 더 구매해야 할 수도 있다. 미리 인터넷으로 조사를 해보니 다행히도 맥주를 파는 편의

www.acmicpc.net

1. 주의할 점

- 50m걸을 때마다 맥주를 1개씩 줄이는 방식으로 하면 복잡하다

  -> 1000m이내에 편의점 혹은 도착지점이 존재하면 경로가 있다고 가정한다

- 시작지점과 도착지점이 1000m이내면 BFS를 진행안해도 된다(하면 시간낭비)

 

2. 구현

- BFS를 이용하여 현재 지점과 1000m이내에 다른 지점이 있다면 추가 + visit배열 true로 설정

 

#include <iostream>
#include <queue>
#include <algorithm>
#include <math.h>
#include <vector>
using namespace std;
bool visit[100];
struct info {
	int x, y, idx;
};
info tmp;
vector<info> v;
int main() {
	int test, sx, sy, mart, tx, ty, x, y;
	cin >> test;
	for (int t = 0; t < test; t++) {
		cin >> mart >> sx >> sy;
		bool finish = false;
		queue<info> q;
		v.clear();
		for (int i = 0; i < mart; i++)
			visit[i] = false;
		for (int i = 0; i < mart; i++) {
			cin >> x >> y;
			tmp.x = x;
			tmp.y = y;
			tmp.idx = i;
			v.push_back(tmp);
			if (abs(sx - x) + abs(sy - y) <= 1000) {
				q.push(tmp);
				visit[i] = true;
			}
		}
		cin >> tx >> ty;
		if (abs(sx - tx) + abs(sy - ty) <= 1000)		//집에서 바로 페스티벌까지 갈 수 있는 경우
			cout << "happy\n";
		else {
			while (!q.empty()) {
				int cx = q.front().x;
				int cy = q.front().y;
				int cidx = q.front().idx;
				q.pop();
				if (abs(cx - tx) + abs(cy - ty) <= 1000) {
					finish = true;
					break;
				}
				for (int i = 0; i < v.size(); i++) {
					if (visit[v[i].idx]) continue;
					int dist = abs(cx - v[i].x) + abs(cy - v[i].y);
					if (dist <= 1000) {
						visit[i] = true;
						tmp.x = v[i].x;
						tmp.y = v[i].y;
						tmp.idx = v[i].idx;
						q.push(tmp);
					}
				}
			}
			if (finish) cout << "happy\n";
			else cout << "sad\n";
		}
	}
	system("pause");
	return 0;
}
728x90
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 11437] LCA (C++)  (0) 2020.03.07
[백준 8978] 올림픽 (C++)  (0) 2020.03.06
[백준 14502] 연구소 (C++)  (0) 2020.03.06
[백준 5214] 환승 (C++)  (0) 2020.03.06
[백준 4179] 불! (C++)  (0) 2020.03.05
Comments