9205번: 맥주 마시면서 걸어가기
송도에 사는 상근이와 친구들은 송도에서 열리는 펜타포트 락 페스티벌에 가려고 한다. 올해는 맥주를 마시면서 걸어가기로 했다. 출발은 상근이네 집에서 하고, 맥주 한 박스를 들고 출발한다.
www.acmicpc.net
문제 풀이
1. 무사히 도착하면 flag를 1로 하여 happy 출력
2. 시작지부터 dfs 시작
DFS
1) 지금 위치랑 목적지랑 거리가 1000이하면 flag =1 하고 종료
2) for문으로 market들 확인, 방문한거면 재낀다
3) 방문안했어도 거리가 1000넘으면 못가니까 재낀다
4) 방문 가능한 market으로 이동 후 DFS
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
pair<int, int> house;
pair<int, int> festival;
vector<pair<int, int> > market;
int visited[101] = { 0, };
int flag;
void dfs(int x, int y)
{
if (abs(x - festival.first) + abs(y - festival.second) <= 1000) // 최대 이동거리는 20 * 50 =1000
{
flag = 1;
return;
}
for (int i = 0; i < market.size(); i++)
{
if (visited[i] == 1) // 방문한거 재껴
continue;
if (abs(x - market[i].first) + abs(y - market[i].second) > 1000) //갈수 없는곳 재껴
continue;
visited[i] = 1;
dfs(market[i].first, market[i].second);
}
}
int main()
{
int tc;
int n;
int data_1, data_2;
cin >> tc;
for (int i = 0; i < tc; i++)
{
for (int j = 0; j < 101; j++)
visited[j] = 0;
flag = 0;
while (!market.empty())
market.pop_back();
cin >> n;
cin >> data_1 >> data_2;
house.first = data_1;
house.second = data_2;
for (int j = 0; j < n; j++)
{
cin >> data_1 >> data_2;
market.push_back(make_pair(data_1, data_2));
}
cin >> data_1 >> data_2;
festival.first = data_1;
festival.second = data_2;
dfs(house.first, house.second);
if (flag == 1)
cout << "happy" << endl;
else
cout << "sad" << endl;
}
return 0;
}
후기
음... 솔직히 말해서 왜 풀리는지 모르겠다, 그냥 완전 직관적으로 떠오르는대로 해버렸는데 맞아버렸다
내가 의문인건 만약에 주어진 market들이 점점 목적지랑 멀어지는 곳에 있는 거라면...?
의문 해결!!
시작지에서 목적지가 1000이하던지!!
그 어떤 편의점 하나라도 목적지까지 1000이하면 되니까 노상관!!!
'c++ > Baekjoon Online' 카테고리의 다른 글
백준 10844 : 쉬운 계단 c++ (0) | 2020.09.22 |
---|---|
백준 17070 파이프 옮기기 1 c++ (0) | 2020.09.13 |
백준 15684 : 사다리 조작 C++ (0) | 2020.09.06 |
백준 13458 : 시험 감독 c++ (0) | 2020.09.06 |
백준 10836: 여왕벌 C++ (0) | 2020.09.06 |