mojo's Blog
[백준 2146] 다리 만들기 본문
문제 링크 => 2146번: 다리 만들기 (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