문제: icpc.me/2146
dfs를 이용하여 각 나라들을 구분해준 후 bfs를 이용하여 각 나라들에서 어떤 다른 나라로 갈 수 있는 최단 거리를 모두 구해준 뒤 그 중 최솟값을 출력해주면 된다.
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | #include <cstdio> #include <algorithm> #include <queue> #include <vector> #include <cstring> using namespace std; int n, a[101][101], disc[101][101], c; bool chk(int x, int y) { return 0 <= x&&x < n && 0 <= y&&y < n; } int dx[] = { 0,0,1,-1 }; int dy[] = { 1,-1,0,0 }; void dfs(int x, int y, int c) { disc[x][y] = true; a[x][y] = c; for (int i = 0; i < 4; i++) { int cx = x + dx[i]; int cy = y + dy[i]; if (chk(cx, cy) && a[cx][cy] && !disc[cx][cy]) dfs(cx, cy, c); } } int bfs(int c) { queue<pair<int, int>> qu; memset(disc, 0, sizeof(disc)); for (int i = 0; i < n; i++) { for (int j = 0; j < n;j++) if (a[i][j] == c) { disc[i][j] = 1; qu.push({ i,j }); } } int ret = 0; while (qu.size()) { int qs = qu.size(); while (qs--) { int x = qu.front().first; int y = qu.front().second; qu.pop(); for (int i = 0; i < 4; i++) { int cx = x + dx[i]; int cy = y + dy[i]; if (!chk(cx, cy)) continue; if (a[cx][cy] != 0 && a[cx][cy] != c) return ret; if (a[cx][cy] == 0 && !disc[cx][cy]) { disc[cx][cy] = 1; qu.push({ cx,cy }); } } } ret++; } } int main() { scanf("%d", &n); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) scanf("%d", &a[i][j]); } for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) if (a[i][j] && !disc[i][j]) dfs(i, j, ++c); } int r = 987654321; for (int i = 1; i <= c; i++) r = min(r, bfs(i)); printf("%d\n", r); return 0; } | cs |
'알고리즘 관련 > BOJ' 카테고리의 다른 글
BOJ)10422 괄호 (0) | 2017.03.30 |
---|---|
BOJ)1194 달이 차오른다, 가자. (0) | 2017.03.30 |
BOJ)5427 불 (0) | 2017.03.30 |
BOJ)1745 숨기 (0) | 2017.03.29 |
BOJ)5397 키로거 (0) | 2017.03.28 |