mojo's Blog

[백준 2146] 다리 만들기 본문

백준/BFS, DFS

[백준 2146] 다리 만들기

_mojo_ 2021. 7. 19. 23:22

문제 링크 => 2146번: 다리 만들기 (acmicpc.net)

 

2146번: 다리 만들기

여러 섬으로 이루어진 나라가 있다. 이 나라의 대통령은 섬을 잇는 다리를 만들겠다는 공약으로 인기몰이를 해 당선될 수 있었다. 하지만 막상 대통령에 취임하자, 다리를 놓는다는 것이 아깝다

www.acmicpc.net


전형적인 BFS 문제이다.

 

먼저 대륙별로 숫자를 매기도록 하였다. (1번 대륙, 2번 대륙, ..., i번 대륙)

 

그리고 각 육지별로 BFS 를 돌려서 바다로 이동이 가능하며 다른 대륙을 발견한 경우 거리를 return 하도록 하여 그 거리들 중에 최솟값이 정답이 된다.

 

풀이 code

#define _CRT_SECURE_NO_WARNINGS
#include <string>
#include <stdio.h>
#include <math.h>
#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <time.h>
#define INF 100000000
#define endl '\n'
#define MOD 1000000009
#define ll long long

using namespace std;

int n;
bool visited[101][101];
map<pair<int, int>, int> m; 
int Map[101][101];
int dx[4] = { 1,-1,0,0 };
int dy[4] = { 0,0,1,-1 };

void init() {
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			visited[i][j] = false;
		}
	}
}

void compose_Ground(int startX, int startY, int ground) {
	queue<pair<int, int>> q;
	q.push({ startX,startY });
	visited[startX][startY] = true;
	while (!q.empty()) {
		int x = q.front().first;
		int y = q.front().second;
		m[{x, y}] = ground;
		q.pop();
		for (int i = 0; i < 4; i++) {
			int nextX = x + dx[i];
			int nextY = y + dy[i];
			if (nextX >= 0 && nextX < n && nextY >= 0 && nextY < n) {
				if (Map[nextX][nextY] == 1 && !visited[nextX][nextY]) {
					visited[nextX][nextY] = true;
					q.push({ nextX,nextY });
				}
			}
		}
	}
}

int find_Length(int startX, int startY, int ground) {
	queue<pair<pair<int,int>,int>> q;
	q.push({ {startX,startY},0 });
	visited[startX][startY] = true;
	while (!q.empty()) {
		int x = q.front().first.first;
		int y = q.front().first.second;
		int dist = q.front().second;
		q.pop();
		for (int i = 0; i < 4; i++) {
			int nextX = x + dx[i];
			int nextY = y + dy[i];
			if (nextX >= 0 && nextX < n && nextY >= 0 && nextY < n) {
				if (!visited[nextX][nextY] && !Map[nextX][nextY]) {
					visited[nextX][nextY] = true;
					q.push({ {nextX,nextY},dist + 1 });
				}
				else if (!visited[nextX][nextY] && Map[nextX][nextY] && m[{nextX, nextY}] != ground) {
					return dist;
				}
			}
		}
	}

	return INF;
}

int main() {
	ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);

	cin >> n;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			cin >> Map[i][j];
		}
	}

	int ground = 1;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			if (Map[i][j] && !m[{i, j}]) {
				compose_Ground(i, j, ground++);
			}
		}
	}

	int len = INF;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			if (Map[i][j]) {
				init();
				len = min(len, find_Length(i, j, m[{i, j}]));
			}
		}
	}

	cout << len;

	return 0;
}

'백준 > BFS, DFS' 카테고리의 다른 글

[백준 2573] 빙산  (0) 2021.11.14
[백준 15684] 사다리 조작  (0) 2021.09.05
[백준 16947] 서울 지하철 2호선  (0) 2021.07.19
[백준 19538] 루머  (0) 2021.07.17
[백준 16929] Two Dots  (0) 2021.07.07
Comments