반응형
[문제 풀이]
- BFS를 사용해 각각의 섬들의 좌표들을 찾는다.
- 서로 다른 섬의 좌표끼리 비교하며 가장 가까운 거리를 구한다.
[코드]
- BFS를 사용해 각각의 섬들의 좌표들을 찾는다.
void check(int y, int x){
queue<pair<int, int> > q;
q.push(make_pair(y, x));
vc[k].push_back(make_pair(y, x));
visit[y][x] = 1;
while(!q.empty()){
int oy = q.front().first;
int ox = q.front().second;
q.pop();
for(int i=0; i<4; i++){
int ny = oy + dy[i];
int nx = ox + dx[i];
if(ny < 0 || nx < 0 || ny >= N || nx >= N) continue;
if(map[ny][nx] == 1 && visit[ny][nx] == 0){
vc[k].push_back(make_pair(ny, nx));
q.push(make_pair(ny, nx));
visit[ny][nx] = 1;
}
}
}
}
- 서로 다른 섬의 좌표끼리 비교하며 가장 가까운 거리를 구한다.
for(int i=0; i<k-1; i++){
for(int j=0; j<vc[i].size(); j++){
int oy = vc[i][j].first;
int ox = vc[i][j].second;
for(int t=i+1; t<k; t++){
for(int r=0; r<vc[t].size(); r++){
int ny = vc[t][r].first;
int nx = vc[t][r].second;
int tmp = abs(oy - ny) + abs(ox - nx) - 1;
if(answer > tmp) answer = tmp;
}
}
}
}
[전체 코드]
#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
int dy[4] = {-1, 0, 1, 0};
int dx[4] = {0, 1, 0, -1};
int N, map[101][101] = {0, }, k = 0, visit[101][101] = {0, }, answer = 987654321;
vector<pair<int, int> > vc[10001];
void check(int y, int x){
queue<pair<int, int> > q;
q.push(make_pair(y, x));
vc[k].push_back(make_pair(y, x));
visit[y][x] = 1;
while(!q.empty()){
int oy = q.front().first;
int ox = q.front().second;
q.pop();
for(int i=0; i<4; i++){
int ny = oy + dy[i];
int nx = ox + dx[i];
if(ny < 0 || nx < 0 || ny >= N || nx >= N) continue;
if(map[ny][nx] == 1 && visit[ny][nx] == 0){
vc[k].push_back(make_pair(ny, nx));
q.push(make_pair(ny, nx));
visit[ny][nx] = 1;
}
}
}
}
int main(){
cin>>N;
for(int i=0; i<N; i++){
for(int j=0; j<N; j++){
cin>>map[i][j];
}
}
for(int i=0; i<N; i++){
for(int j=0; j<N; j++){
if(visit[i][j] == 0 && map[i][j] == 1){
check(i, j);
k++;
}
}
}
for(int i=0; i<k-1; i++){
for(int j=0; j<vc[i].size(); j++){
int oy = vc[i][j].first;
int ox = vc[i][j].second;
for(int t=i+1; t<k; t++){
for(int r=0; r<vc[t].size(); r++){
int ny = vc[t][r].first;
int nx = vc[t][r].second;
int tmp = abs(oy - ny) + abs(ox - nx) - 1;
if(answer > tmp) answer = tmp;
}
}
}
}
cout<<answer<<"\n";
return 0;
}
https://www.acmicpc.net/problem/2146
반응형
'Algorithm > Baekjoon' 카테고리의 다른 글
[ 백준 12789 ] 도키도키 간식드리미 (C++) (0) | 2025.01.26 |
---|---|
[ 백준 17266 ] 어두운 굴다리 (JAVA) (1) | 2025.01.13 |
[ 백준 1937 ] 욕심쟁이 판다 (C++) (0) | 2024.12.30 |
[ 백준 5046 ] 전국 대학생 프로그래밍 대회 동아리 연합 (C++) (0) | 2024.12.13 |
[ 백준 4659 ] 비밀번호 발음하기 (C++) (1) | 2024.12.12 |