Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 알고리즘
- 우분투
- ubuntu
- Unity
- 리눅스
- 다이나믹 프로그래밍
- c#
- linux
- uclidean algorithm
- C++
- 문제풀이
- 백준
- 유니티
- 내적
- SOH
- 분할축 이론
- Expanding Polytope Algorithm
- Doubly Connected Edge List
- Vector
- AABB
- 외적
- GJK
- 수학
- C
- 보로노이다이어그램
- dp
- 벡터
- Graham Scan
- PS
- 충돌 알고리즘
Archives
- Today
- Total
마이 플밍 블로그
[C++] 백준 2146 - 다리 만들기 본문
풀이
bfs가 아닌 dfs로 풀어서 조금 애먹었던 문제이다.
섬들에 번호를 매기고 각 섬의 가장자리 부분들의 위치를 저장한뒤 가장자리 에서 부터 시작해서 다른 섬으로 다리를 점점 넓혀나가면 된다.
코드
#include <bits/stdc++.h>
using namespace std;
int board[101][101];
int flag[101][101];
int region[101][101];
int regionNum = 1;
int n;
int dx[4] = {0,0,-1,1};
int dy[4] = {1,-1,0,0};
vector<pair<int,int>> edges;
int mminL = 1000000;
bool InMap(int x, int y){
if(0 <= x && x < n && 0 <= y && y < n)
return true;
return false;
}
void FindRegion(int x,int y){
if(region[y][x] != 0){
return;
}
region[y][x] = regionNum;
int nR = region[y][x];
bool isEdge = false;
for(int i =0; i < 4; i++){
int nx = dx[i] + x;
int ny = dy[i] + y;
if(InMap(nx,ny) && board[ny][nx] == 1 && region[ny][nx] == 0){
FindRegion(nx,ny);
}
if(InMap(nx,ny) && board[ny][nx] == 0){
isEdge = true;
}
}
if(isEdge){
edges.push_back(make_pair(x,y));
}
}
int BuildBridge(int x,int y){
int minL = 100000;
int r = region[y][x];
queue<tuple<int,int,int>> nextQ;
nextQ.push(make_tuple(x,y,0));
while(!nextQ.empty()){
int qx = get<0>(nextQ.front());
int qy = get<1>(nextQ.front());
int ql = get<2>(nextQ.front());
nextQ.pop();
if(flag[qy][qx] <= ql){
continue;
}
flag[qy][qx] = ql;
for(int i =0; i < 4; i++){
int nx = dx[i] + qx;
int ny = dy[i] + qy;
if(!InMap(nx,ny)){
continue;
}
if(board[ny][nx] == 0 && flag[ny][nx] > ql+1){
nextQ.push(make_tuple(nx,ny,ql+1));
}
if(board[ny][nx] == 1 && region[ny][nx] != r){
minL = min(minL, ql);
}
}
}
if(mminL <= minL){
minL = mminL;
}
flag[y][x] = minL;
return minL;
}
int main()
{
ios_base::sync_with_stdio(0); cin.tie(0);
cin >> n;
for(int y = 0; y < n; y++){
for(int x = 0; x < n; x++){
cin >> board[y][x];
}
}
for(int y = 0; y < n; y++){
for(int x = 0; x < n; x++){
flag[y][x] = 100000;
if(board[y][x] == 1 && region[y][x] == 0){
FindRegion(x,y);
regionNum++;
}
}
}
for(int i =0; i < edges.size(); i++){
int x = edges[i].first;
int y = edges[i].second;
mminL = min(mminL,BuildBridge(x,y));
}
cout << mminL;
return 0;
}
'문제풀이 > 백준' 카테고리의 다른 글
[C++] 백준 14442 - 벽 부수고 이동하기 2 (1) | 2023.10.07 |
---|---|
[C++] 백준 1600 - 말이 되고픈 원숭이 (1) | 2023.10.06 |
[C++] 백준 5567 - 결혼식 (0) | 2023.02.26 |
[C++] 백준 1937 - 욕심쟁이 판다 (0) | 2023.02.26 |
[C++]백준 11780 - 플로이드2 (0) | 2022.12.13 |