728x90
문제 링크
풀이 아이디어
dfs bfs 말고 플로이드 와샬로 풀었다.
x,y좌표를 한꺼번에 담아야 하므로 pair<int,int> 꼴의 배열을 준비했다.
코드를 편하게 짜기 위해 갈수 있냐없냐를 bool 함수로 준비했고,
편의점 n개, 시작점 끝점 1개씩을 저장할 수 있는 d 이차원 배열 역시 준비했다.
적당히 큰 값으로 d 배열을 초기화 한 후,
한 포인트에서 다른 포인트로 갈 수 있으면 그 값을 1로 바꾸었다.
그리고 플로이드 와샬을 통해 경로를 최적화 한 후,
d[0][n+1] 값을 비교해 (출발-끝 거리) 결과를 뽑아내면 된다.
코드
#include <bits/stdc++.h>
using namespace std;
pair<int,int> point[102];
int t,n;
int d[102][102];
bool isavailable(int sidx,int eidx){
if(abs(point[sidx].first-point[eidx].first) + abs(point[sidx].second - point[eidx].second)<=1000)
return true;
else return false;
}
int main(void){
cin>>t;
while(t--){
cin>>n;
for(int i=0; i<n+2; i++){
cin>>point[i].first>>point[i].second;
}
for(int i=0; i<n+2; i++){
for(int j=0; j<n+2; j++){
if(i!=j) d[i][j]=102;
}
}
for(int i=0; i<n+2; i++){
for(int j=0; j<n+2; j++){
if(i==j) continue;
if(isavailable(i,j)) d[i][j]=1;
}
}
//플로이드와샬이 지금 들어감.
for(int k=0; k<n+2; k++){
for(int i=0; i<n+2; i++){
for(int j=0; j<n+2; j++){
if(d[i][j]>d[i][k]+d[k][j])
d[i][j]=d[i][k]+d[k][j];
}
}
}
if(0<d[0][n+1] && d[0][n+1]<102)
cout<<"happy\n";
else cout<<"sad\n";
}
}
'알고리즘 > 백준' 카테고리의 다른 글
백준 1976 여행가자 - 2차원 array 형태로 데이터 주어질 때 효과적인 union find (0) | 2021.01.14 |
---|---|
백준 2533 사회망 서비스 - 가장 쉽고 자세한 트리 dp로 푸는 방법 (0) | 2021.01.14 |
백준 1620 - 나는야 포켓몬 마스터 이다솜 (0) | 2021.01.06 |
백준 2565 전깃줄 - 아이디어가 중요한 DP 문제 (0) | 2021.01.06 |
백준 2644 촌수계산 - bfs에서 메모리초과가 안뜨게 하려면? (0) | 2021.01.04 |