어흥
[백준 9205] 맥주 마시면서 걸어가기 (C++) 본문
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