[ 백준 2146 ] 다리 만들기 (C++)

2024. 12. 9. 00:53·Algorithm/Baekjoon
반응형

[문제 풀이]

  1. BFS를 사용해 각각의 섬들의 좌표들을 찾는다.
  2. 서로 다른 섬의 좌표끼리 비교하며 가장 가까운 거리를 구한다.

[코드]

  • 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
'Algorithm/Baekjoon' 카테고리의 다른 글
  • [ 백준 17266 ] 어두운 굴다리 (JAVA)
  • [ 백준 1937 ] 욕심쟁이 판다 (C++)
  • [ 백준 5046 ] 전국 대학생 프로그래밍 대회 동아리 연합 (C++)
  • [ 백준 4659 ] 비밀번호 발음하기 (C++)
CodeCaptain
CodeCaptain
BackEnd Developer code-0dyssey 님의 블로그 입니다.
  • CodeCaptain
    Code Odyssey
    CodeCaptain
  • 전체
    오늘
    어제
    • All (18)
      • BackEnd (3)
      • FrontEnd (0)
      • DB (0)
      • DevOps (1)
      • Algorithm (12)
        • Baekjoon (12)
      • CS (0)
      • ETC (2)
        • 회고 (1)
        • 책 (1)
  • 인기 글

  • 최근 댓글

  • 최근 글

  • 반응형
  • hELLO· Designed By정상우.v4.10.1
CodeCaptain
[ 백준 2146 ] 다리 만들기 (C++)
상단으로

티스토리툴바