Hello Ocean! ๐ŸŒผ

[๋ฐฑ์ค€/C++] 2146. ๋‹ค๋ฆฌ ๋งŒ๋“ค๊ธฐ ๋ณธ๋ฌธ

Algorithm

[๋ฐฑ์ค€/C++] 2146. ๋‹ค๋ฆฌ ๋งŒ๋“ค๊ธฐ

bba_dda 2021. 5. 19. 11:54
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ

https://www.acmicpc.net/problem/2146

๊ฐ๊ฐ์˜ ์„ฌ(์œก์ง€ ๋ฉ์–ด๋ฆฌ?)์—์„œ ๋‹ค๋ฅธ ์„ฌ ๊นŒ์ง€ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜ ์ค‘์— ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค!

ํ’€์ด

DFS์™€ BFS๋ฅผ ๋ชจ๋‘ ์ด์šฉํ–ˆ๋‹ค.

๋จผ์ €, ๊ฐ ์„ฌ๋“ค์˜ ๋ฒˆํ˜ธ๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด DFS๋ฅผ ๋Œ๋ ธ๋‹ค.

๊ทธ ํ›„์— BFS๋ฅผ ๋Œ๋ ค์„œ ์–ด๋–ค ์„ฌ์—์„œ ๋˜ ๋‹ค๋ฅธ ์„ฌ๊นŒ์ง€ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•œ ํ›„์—, ๊ทธ ์ค‘์— ์ตœ์†Ÿ๊ฐ’์„ ์ถœ๋ ฅํ–ˆ๋‹ค. 

๋งต์˜ ํฌ๊ธฐ(n)์ด 100์ดํ•˜์ด๊ธฐ ๋•Œ๋ฌธ์— input์ด ์ž‘์•„์„œ ์‹œ๊ฐ„์ดˆ๊ณผ ๊ฑฑ์ • ์—†์ด ํ’€์—ˆ๋‹ค. 

์ฝ”๋“œ

#include<iostream>
#include<queue>
#include<vector>

using namespace std;

#define LAND 1
#define SEA 0 

int dr[4] = { -1,1,0,0 };
int dc[4] = { 0,0,-1,1 };
int map[101][101] = { 0, };
bool visited[101][101] = { 0, };
int n;

void DFS(int r, int c, int num) {
	visited[r][c] = true;
	map[r][c] = num; //๋ช‡๋ฒˆ ์„ฌ์ธ์ง€ ํ‘œ์‹œ
	for (int i = 0;i < 4;i++) {
		int next_r = r + dr[i];
		int next_c = c + dc[i];
		if (next_r >= n || next_r < 0 || next_c >= n || next_c < 0) continue;

		if (map[next_r][next_c] && !visited[next_r][next_c])
			DFS(next_r, next_c, num);
	}
}
int BFS(int cnt) {
	queue<pair<int, int>> q;

	//ํ์— ํ•ด๋‹น ๋ฒˆํ˜ธ์˜ ์„ฌ์˜ ์ขŒํ‘œ๋ฅผ ๋‹ค ๋„ฃ๊ธฐ
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			if (map[i][j] == cnt) {
				visited[i][j] = true;
				q.push(make_pair(i, j));
			}
		}
	}
	int result = 0;
	while (!q.empty()){
		int curSize = q.size();

		//ํ˜„์žฌ ํ์— ์žˆ๋Š” ์นธ์—์„œ ํ•œ์นธ์”ฉ ์ „์ง„
		for (int i = 0; i < curSize; i++) {
			int r = q.front().first;
			int c = q.front().second;
			q.pop();
			for (int i = 0; i < 4; i++) {
				int next_r = r + dr[i];
				int next_c= c + dc[i];

				//๋ฒ”์œ„ ๋‚ด์— ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌ 
				if (0 <= next_r && next_r < n && 0 <= next_c && next_c < n) {
					//๋‹ค๋ฅธ ์„ฌ์— ๋„์ฐฉํ•˜๋ฉด return
					if (map[next_r][next_c] && map[next_r][next_c] != cnt)
						return result;

					//๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋ฐ”๋‹ค์ด๋ฉด ๋ฐฉ๋ฌธํ–ˆ๋‹ค๊ณ  ํ‘œ์‹œ ํ›„ ํ์— ๋„ฃ๊ธฐ
					else if (map[next_r][next_c]  == SEA && !visited[next_r][next_c]) {
						visited[next_r][next_c] = true;
						q.push(make_pair(next_r, next_c));
					}
				}
			}
		}
		result++;
	}
}

int main(void) {
	cin >> n;
	for (int r = 0;r < n;r++) {
		for (int c = 0;c < n;c++) {
			cin >> map[r][c];
		}
	}
	int num = 1;
	for (int r = 0;r < n;r++) {
		for (int c = 0;c < n;c++) {
			if (map[r][c] == LAND && !visited[r][c]) {
				DFS(r, c, num);
				num++;
			}
		}
	}
	int min_dist = 987654321;
	for (int i = 1;i<num;i++) {
		fill(&visited[0][0], &visited[100][101], 0);
		min_dist = min(min_dist, BFS(i));
	}
	cout << min_dist << endl;
	return 0;
}

 

๊ฒฐ๊ณผ

๋ฐ˜์‘ํ˜•