티스토리 뷰
문제는 링크로 대체합니다.
https://www.acmicpc.net/problem/9205
9205번: 맥주 마시면서 걸어가기
문제 송도에 사는 상근이와 친구들은 송도에서 열리는 펜타포트 락 페스티벌에 가려고 한다. 올해는 맥주를 마시면서 걸어가기로 했다. 출발은 상근이네 집에서 하고, 맥주 한 박스를 들고 출발한다. 맥주 한 박스에는 맥주가 20개 들어있다. 목이 마르면 안되기 때문에 50미터에 한 병씩 마시려고 한다. 상근이의 집에서 페스티벌이 열리는 곳은 매우 먼 거리이다. 따라서, 맥주를 더 구매해야 할 수도 있다. 미리 인터넷으로 조사를 해보니 다행히도 맥주를 파는 편의
www.acmicpc.net
문제를 간략히하면 출발점에서 도착점으로 도달할 수 있느냐를 결정하는 것입니다. 맥주를 50m마다 마시고 20병의 제한이 있다는둥 뭔가 있어보일듯하게 문제를 설명하였지만 핵심만을 파악하여야 합니다. 이동간에 맥주를 얼만큼 마시든 편의점을 들릴수만 있다면 다시 20병으로 가득 채울 수 있기 때문에 입력을 노드 그래프로 표현해보면 각 편의점이 하나의 노드가 되고 서로 다른 편의점 간의 거리가 1000이하인 곳은 양방향의 길이 있다고 생각하면 됩니다. 그래서 입력을 통해 간선정보를 저장한뒤에 bfs혹은 dfs로 경로탐색을 통해 도착노드에 도달할 수 있다면 happy를 없다면 sad를 출력하면 됩니다.
그래서 각 편의점당 이동이 가능한 편의점들을 저장하기 위해 vector<편의점번호> map[MAX_N] 을 사용하였고 간선들을 저장한 후에는 bfs를 수행하였습니다.
#include <iostream> #include <algorithm> #include <math.h> #include <string> #include <queue> using namespace std; #define MAX_T 50 #define MAX_N 102 int T, N; pair<int, int> conv[MAX_N];//각 위치의 좌표를 저장. vector<int> map[MAX_N];//이동이 가능한 지점의 인덱스를 저장. int visit[MAX_N]; int result[MAX_T]; bool happy_sad() { int now_node; queue<int> q; q.push(0); while (q.empty() == false) { now_node = q.front(); //printf("node %d\n", now_node); if (now_node == N + 1) { return true; } q.pop(); visit[now_node] = 1; for (int i = 0; i < map[now_node].size(); i++) { if (visit[map[now_node][i]] == 0) { q.push(map[now_node][i]); } } } return false; } void clear() { for (int i = 0; i < N + 2; i++) { visit[i] = 0; map[i].clear(); } } int main() { scanf("%d", &T); for (int i = 0; i < T; i++) { scanf("%d", &N); for (int j = 0; j < N + 2; j++) { scanf("%d %d", &conv[j].first, &conv[j].second); for (int k = 0; k < j; k++) { int man_dis = abs(conv[k].first - conv[j].first) + abs(conv[k].second - conv[j].second); if (man_dis <= 1000) { map[j].push_back(k); map[k].push_back(j); } } } //for (int i = 0; i < N + 2; i++) { // for (int j = 0; j < map[i].size(); j++) { // printf("%d ", map[i][j]); // } // printf("\n"); //} result[i] = happy_sad() ? 1 : 0; clear(); } for (int i = 0; i < T; i++) { result[i] ? printf("happy\n") : printf("sad\n"); } }
'알고리즘' 카테고리의 다른 글
C++ Vector 활용 A 부터 Z까지 (0) | 2020.10.21 |
---|---|
백준 2004 - 조합 0의 개수(상세풀이) (1) | 2020.02.13 |
백준 2178 - 미로 탐색 (0) | 2020.02.09 |
백준 6118번 - 숨바꼭질 (0) | 2020.02.07 |
백준 - 1012 유기농 배추 (0) | 2020.02.06 |
- Total
- Today
- Yesterday
- 구글맵
- 깃 용량문제
- 언리얼
- refusing to run with root privileges
- 언리얼 기초
- C언어기초
- UHT
- Jenkins Build Periodically
- 언리얼 사용자 정의 구조체
- Unreal Header Tool
- C++
- 백준
- 깃 허브 오류 해결
- Connecting Jenkins Agent
- 빌드 주기
- Add Node
- 안드로이드
- Connecting Jenkins
- 언리얼 빌드
- 유니티
- 알고리즘
- 안드로이드 구글맵
- c언어 기초
- 알고리즘기초
- c언어강의
- Jenkins
- dfs
- 젠킨스 에이전트 연결
- 유니티 직소퍼즐 구현
- 젠킨스
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |