BOJ 2234 :: 성곽
문제 링크 : https://www.acmicpc.net/problem/2234
나의 풀이
- 비트연산으로 이웃한 칸에 갈 수 있는지 확인하면서 그룹을 짓는다.
if (castle[x][y] & (1 << i)) continue;
- 왼쪽 윗칸부터 시작하여 오른쪽칸 또는 아랫칸에 현재 칸의 방과 다른 방이 있다면 두 방의 크기를 합했을 때 가장 큰 값을 갱신한다.
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n-1; j++)
{
if (group[i][j] != group[i][j + 1])
ret = point[group[i][j]] + point[group[i][j + 1]];
if (ans3 < ret) ans3 = ret;
}
}
for (int i = 0; i < m-1; i++)
{
for (int j = 0; j < n; j++)
{
if (group[i][j] != group[i+1][j])
ret = point[group[i][j]] + point[group[i+1][j]];
if (ans3 < ret) ans3 = ret;
}
}
나의 코드
Github : https://github.com/j2wooooo/Daliy_Algorithms/blob/master/Daliy_Algorithms/BOJ_2234/BOJ_2234.cpp
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 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 | // 백준알고리즘 2234번 :: 성곽 #include<iostream> #include<queue> using namespace std; int n, m, ans1, ans2, ans3; unsigned int castle[51][51]; int visited[51][51]; int group[51][51]; int cnt = 0; // 서 북 동 남 int dx[4] = {0, -1, 0, 1}; int dy[4] = {-1, 0, 1, 0}; int point[2501] = { 0 }; void bfs(int _x, int _y) { cnt++; queue<pair<int, int>>q; q.push(make_pair(_x, _y)); visited[_x][_y] = 1; group[_x][_y] = cnt; int size = 1; while (!q.empty()) { int qsz = q.size(); while (qsz--) { int x = q.front().first; int y = q.front().second; q.pop(); for (int i = 0; i < 4; i++) { int mx = x + dx[i]; int my = y + dy[i]; if (mx < 0 || mx >= m || my < 0 || my >= n) continue; if (visited[mx][my]) continue; if (castle[x][y] & (1 << i)) continue; visited[mx][my] = 1; group[mx][my] = cnt; q.push(make_pair(mx, my)); size++; } } } point[cnt] = size; return; } int main(void) { cin >> n >> m; for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { cin >> castle[i][j]; } } for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (visited[i][j]) continue; bfs(i, j); } } int ret = 0; ans1 = cnt; for (int i = 1; i <= cnt; i++) { ret = point[i]; if (ans2 < ret) ans2 = ret; } for (int i = 0; i < m; i++) { for (int j = 0; j < n-1; j++) { if (group[i][j] != group[i][j + 1]) ret = point[group[i][j]] + point[group[i][j + 1]]; if (ans3 < ret) ans3 = ret; } } for (int i = 0; i < m-1; i++) { for (int j = 0; j < n; j++) { if (group[i][j] != group[i+1][j]) ret = point[group[i][j]] + point[group[i+1][j]]; if (ans3 < ret) ans3 = ret; } } cout << ans1 << '\n'<< ans2 << '\n' << ans3 << '\n'; return 0; } | cs |
'Problem > BFS' 카테고리의 다른 글
[C/C++] BOJ 3/2 코딩테스트 대비 모의고사 B번 - Baaaaaaaaaduk2 (Easy) (0) | 2019.03.02 |
---|---|
[C/C++] BOJ 16234 :: 인구 이동 (0) | 2019.02.28 |
[C/C++] BOJ 1938 :: 통나무 옮기기 (0) | 2019.02.17 |
[C/C++] BOJ 1600 :: 말이 되고픈 원숭이 (0) | 2019.02.13 |
[C/C++] BOJ 3055 :: 탈출 (0) | 2019.02.12 |