문제링크 : https://www.acmicpc.net/problem/9205
#include<bits/stdc++.h>
using namespace std;
// loc이라는 struct을 만든다.
// x는 x좌표 y는 y좌표이다.
struct loc{
int x, y;
loc(int a, int b){
x= a;
y = b;
}
};
int main(){
ios_base::sync_with_stdio(false);
// freopen("../input.txt","rt",stdin);
int t;
int n;
int ta, tb;
cin >> t;
vector<loc> store;
// 체크배열을 통해 이미 한번 지난 편의점을 다시 지나지 않도록 한다.
// 싸이클 생성을 막기 위해 -> 물론 있어도 상관없지만, 이렇게 처리하는게 효율적이다.
bool ch[101];
for(int tt = 0; tt<t; tt++){
cin >> n;
cin >> ta >> tb;
memset(ch, false, sizeof(ch));
queue<loc> q;
// 시작 좌표를 큐에 넣는다.
q.push(loc(ta, tb));
store.clear();
for(int i=0; i<n; i++){
cin >> ta >> tb;
// 편의점의 위치들을 벡터에 넣어준다.
store.push_back(loc(ta, tb));
}
cin >> ta >> tb;
loc end = loc(ta, tb);
bool flag = false;
while(!q.empty()){
loc ret = q.front();
q.pop();
int dis = abs(ret.x - end.x) + abs(ret.y - end.y);
// 페스티벌에 갈 수 있는지 여부
if(dis <= 1000){
flag = true;
break;
}
// 편의점 가능여부 확인
// 갈 수 있는 편의점은 큐에 넣어 또다시 확인한다.
for(int i=0; i<store.size(); i++){
dis = abs(ret.x - store[i].x) + abs(ret.y - store[i].y);
if(!ch[i] && dis <= 1000){
ch[i] = true;
q.push(store[i]);
}
}
}
if(flag) cout << "happy"<<endl;
else cout << "sad"<<endl;
}
return 0;
}
처음에는 어떻게 해결해야할지 몰랐으나, 이 문제는 도달이 가능한지 아닌지를 찾는 문제이다. 어떻게 보면 편의점 들을 노드, 페스티벌을 목적지로 생각하고 그래프 탐색을 하는 문제와 같다고 볼 수 있다.