HyeLog

๋ฐฑ์ค€_17086_์•„๊ธฐ ์ƒ์–ด2 ๋ณธ๋ฌธ

์•Œ๊ณ ๋ฆฌ์ฆ˜

๋ฐฑ์ค€_17086_์•„๊ธฐ ์ƒ์–ด2

shj718 2022. 7. 8. 19:33

๐Ÿ™‹‍โ™€๏ธ ๋ฌธ์ œ

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

 

17086๋ฒˆ: ์•„๊ธฐ ์ƒ์–ด 2

์ฒซ์งธ ์ค„์— ๊ณต๊ฐ„์˜ ํฌ๊ธฐ N๊ณผ M(2 ≤ N, M ≤ 50)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์— ๊ณต๊ฐ„์˜ ์ƒํƒœ๊ฐ€ ์ฃผ์–ด์ง€๋ฉฐ, 0์€ ๋นˆ ์นธ, 1์€ ์•„๊ธฐ ์ƒ์–ด๊ฐ€ ์žˆ๋Š” ์นธ์ด๋‹ค. ๋นˆ ์นธ๊ณผ ์ƒ์–ด์˜ ์ˆ˜๊ฐ€ ๊ฐ๊ฐ ํ•œ ๊ฐœ ์ด์ƒ์ธ ์ž…๋ ฅ๋งŒ

www.acmicpc.net

 

๐Ÿงฉ ์•Œ๊ณ ๋ฆฌ์ฆ˜

๊ฐ ์นธ์˜ ์•ˆ์ „๊ฑฐ๋ฆฌ = ์•„๊ธฐ ์ƒ์–ด๊นŒ์ง€์˜ ์ตœ์†Œ ๊ฑฐ๋ฆฌ → BFS ์•Œ๊ณ ๋ฆฌ์ฆ˜

 

์‹œ๊ฐ„๋ณต์žก๋„: O((NM)^2) (BFS = O(NM))

2 ≤ N, M ≤ 50 → BFS ๊ฐ€๋Šฅ

 

๐Ÿ’ก ์•„์ด๋””์–ด

๋ชจ๋“  ๋นˆ ์นธ์— ๋Œ€ํ•ด BFS๋กœ ์•ˆ์ „๊ฑฐ๋ฆฌ๋ฅผ ๊ณ„์‚ฐํ•˜๋ฉด์„œ ์ตœ๋Œ“๊ฐ’์„ ๊ฐฑ์‹ 

 

๐Ÿ‘ฉ‍๐Ÿ’ป ์ฝ”๋“œ

#include <iostream>
#include <queue>
#include <vector>
#include <tuple>
#include <algorithm>

using namespace std;

int dx[8] = { 0,0,1,1,1,-1,-1,-1 };
int dy[8] = { 1,-1,1,-1,0,1,-1,0 };

int main() {
	ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	// input
	int n, m;
	cin >> n >> m;
	vector<vector<int>> a(n, vector<int>(m, 0));
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			cin >> a[i][j];
		}
	}
	int ans = 0;
	// BFS
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			if (a[i][j] == 1) continue;
			vector<vector<bool>> visited(n, vector<bool>(m, false));
			vector<vector<int>> dist(n, vector<int>(m, 0));
			// ์•ˆ์ „๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ
			if (!visited[i][j]) {
				// BFS
				queue<pair<int, int>> q;
				q.push(make_pair(i, j));
				visited[i][j] = true;
				dist[i][j] = 0;
				while (!q.empty()) {
					int x, y;
					tie(x, y) = q.front();
					q.pop();
					if (a[x][y] == 1) { // ์•„๊ธฐ ์ƒ์–ด
						if (dist[x][y] > ans) ans = dist[x][y];
						break;
					}
					for (int i = 0; i < 8; i++) {
						int nx = x + dx[i];
						int ny = y + dy[i];
						if (nx >= 0 && nx < n && ny >= 0 && ny < m) {
							if (!visited[nx][ny]) {
								q.push(make_pair(nx, ny));
								visited[nx][ny] = true;
								dist[nx][ny] = dist[x][y] + 1;
							}
						}
					}
				}
			}
		}
	}
	// output
	cout << ans << '\n';
	return 0;
}