https://www.acmicpc.net/problem/9205
문제
송도에 사는 상근이와 친구들은 송도에서 열리는 펜타포트 락 페스티벌에 가려고 한다. 올해는 맥주를 마시면서 걸어가기로 했다. 출발은 상근이네 집에서 하고, 맥주 한 박스를 들고 출발한다. 맥주 한 박스에는 맥주가 20개 들어있다. 목이 마르면 안되기 때문에 50미터에 한 병씩 마시려고 한다. 즉, 50미터를 가려면 그 직전에 맥주 한 병을 마셔야 한다.
상근이의 집에서 페스티벌이 열리는 곳은 매우 먼 거리이다. 따라서, 맥주를 더 구매해야 할 수도 있다. 미리 인터넷으로 조사를 해보니 다행히도 맥주를 파는 편의점이 있다. 편의점에 들렸을 때, 빈 병은 버리고 새 맥주 병을 살 수 있다. 하지만, 박스에 들어있는 맥주는 20병을 넘을 수 없다. 편의점을 나선 직후에도 50미터를 가기 전에 맥주 한 병을 마셔야 한다.
편의점, 상근이네 집, 펜타포트 락 페스티벌의 좌표가 주어진다. 상근이와 친구들이 행복하게 페스티벌에 도착할 수 있는지 구하는 프로그램을 작성하시오.
입력
첫째 줄에 테스트 케이스의 개수 t가 주어진다. (t ≤ 50)
각 테스트 케이스의 첫째 줄에는 맥주를 파는 편의점의 개수 n이 주어진다. (0 ≤ n ≤ 100).
다음 n+2개 줄에는 상근이네 집, 편의점, 펜타포트 락 페스티벌 좌표가 주어진다. 각 좌표는 두 정수 x와 y로 이루어져 있다. (두 값 모두 미터, -32768 ≤ x, y ≤ 32767)
송도는 직사각형 모양으로 생긴 도시이다. 두 좌표 사이의 거리는 x 좌표의 차이 + y 좌표의 차이 이다. (맨해튼 거리)
출력
각 테스트 케이스에 대해서 상근이와 친구들이 행복하게 페스티벌에 갈 수 있으면 "happy", 중간에 맥주가 바닥나서 더 이동할 수 없으면 "sad"를 출력한다.
이 문제에서 알고 싶은건 결국 집에서 출발해서 제한거리(1000)을 준수하면서 편의점에 들려 축제에 가거나,
바로 축제에 가는 경우가 가능한지 물어보는 것이다.
"~ 어디를 거쳐" 라는 문장이 나오면 떠올려야하는 알고리즘이 플로이드 - 와샬 알고리즘이다.
3중 for문으로 이루어진 알고리즘이므로 문제가 제한한 범위를 확인해서 가능하면 바로 사용하면 된다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <cmath>
#define INF 987654321
using namespace std;
// BOJ :: https://www.acmicpc.net/problem/9205
int adj[105][105];
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
int T; cin >> T;
string ok = "happy";
string not_ok = "sad";
for (int testCase = 0; testCase < T; testCase++) {
int N; cin >> N;
vector<pair<int, int>> vertex;
for (int i = 0; i < N + 2; i++) {
int node1, node2;
cin >> node1 >> node2;
vertex.push_back({ node1,node2 });
}
for (int i = 0; i < vertex.size(); i++) {
for (int j = 0; j < vertex.size(); j++) {
if (i == j) adj[i][j] = 1;
else {
int Distance = abs(vertex[i].first - vertex[j].first) + abs(vertex[i].second - vertex[j].second);
if (Distance > 1000) adj[i][j] = INF;
else adj[i][j] = 1;
}
}
}
for (int k = 0; k < vertex.size(); k++) {
for (int i = 0; i < vertex.size(); i++) {
for (int j = 0; j < vertex.size(); j++) {
if (i == j) continue;
else if (i == k || k == j) continue;
else if (adj[i][j] == 1 || (adj[i][k] == 1 && adj[k][j] == 1)) adj[i][j] = 1;
}
}
}
if (adj[0][vertex.size() - 1]==1) cout << ok << endl;
else cout << not_ok << endl;
vertex.clear();
}
return 0;
}
'BOJ > 그래프 이론' 카테고리의 다른 글
[C/C++] 백준 - 1766번 : 문제집 (0) | 2021.08.18 |
---|---|
[C/C++] 백준 - 1238번 : 파티 (다익스트라 알고리즘) (0) | 2021.08.11 |
[C/C++] 백준 - 6087번 (레이저 통신) (0) | 2021.07.16 |
[C/C++] 백준 - 3055번 : 탈출 (0) | 2021.07.13 |
[C/C++] 백준 - 1261번 : 알고스팟 (0) | 2021.07.12 |