์๊ณ ๋ฆฌ์ฆ
๋ฐฑ์ค_2234_์ฑ๊ณฝ
shj718
2022. 7. 8. 20:45
๐โ๏ธ ๋ฌธ์
https://www.acmicpc.net/problem/2234
2234๋ฒ: ์ฑ๊ณฝ
์ฒซ์งธ ์ค์ ๋ ์ ์ N, M์ด ์ฃผ์ด์ง๋ค. ๋ค์ M๊ฐ์ ์ค์๋ N๊ฐ์ ์ ์๋ก ๋ฒฝ์ ๋ํ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋ค. ๋ฒฝ์ ๋ํ ์ ๋ณด๋ ํ ์ ์๋ก ์ฃผ์ด์ง๋๋ฐ, ์์ชฝ์ ๋ฒฝ์ด ์์ ๋๋ 1์, ๋ถ์ชฝ์ ๋ฒฝ์ด ์์ ๋๋ 2๋ฅผ,
www.acmicpc.net
๐งฉ ์๊ณ ๋ฆฌ์ฆ
BFS ์๊ณ ๋ฆฌ์ฆ
๐ก ์์ด๋์ด
์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง ๊ฐ ์นธ์ ์ซ์๋ฅผ 1<<n (์ด๋ n์ 0~3) ๊ณผ AND ์ฐ์ฐํ๋ฉด ๋ฒฝ์ด ์๋์ง ์๋์ง ๊ฒ์ฌํ ์ ์๋ค.
๊ตฌ์ญ์ ์ ์ฅํ๋ ๋ฐฐ์ด(๋ฐฉ๋ฌธ ์ฌ๋ถ๋ ๋ํ๋ผ ์ ์์), ๊ตฌ์ญ ๋์ด๋ฅผ ์ ์ฅํ๋ ๋ฐฐ์ด์ ์ฌ์ฉํ๋ค.
- ์ด ์ฑ์ ์๋ ๋ฐฉ์ ๊ฐ์
- ๊ฐ์ฅ ๋์ ๋ฐฉ์ ๋์ด
- ํ๋์ ๋ฒฝ์ ์ ๊ฑฐํ์ฌ ์ป์ ์ ์๋ ๊ฐ์ฅ ๋์ ๋ฐฉ์ ํฌ๊ธฐ
BFS ํ๋ฒ์ผ๋ก ์ 3๊ฐ์ง๋ฅผ ๋ชจ๋ ๊ตฌํ ์ ์์๋ค.
๐ฉ๐ป ์ฝ๋
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
int n, m;
int a[50][50];
int area[50][50]; // ๊ตฌ์ญ ๋ฒํธ (๋ฐฉ๋ฌธ ์ฌ๋ถ๋ ๊ฒ์ฌ ๊ฐ๋ฅ)
int areaSize[50 * 50 + 1]; // ๊ตฌ์ญ ๋์ด
int dx[4] = { 0,-1,0,1 }; // ์,๋ถ,๋,๋จ ๋ฐฉํฅ
int dy[4] = { -1,0,1,0 };
int bfs(int i, int j, int areaNum) {
queue<pair<int, int>> q;
q.push(make_pair(i, j));
area[i][j] = areaNum;
int cnt = 0; // ๋ฐฉ๋ฌธํ ์ ์ ๊ฐ์ (๊ตฌ์ญ ๋์ด ๊ณ์ฐ)
while (!q.empty()) {
int x = q.front().first;
int y = q.front().second;
q.pop();
cnt += 1;
for (int k = 0; k < 4; k++) {
int nx = x + dx[k];
int ny = y + dy[k];
if (nx < 0 || nx >= n || ny < 0 || ny >= m) continue; // ๋ฒ์ ๊ฒ์ฌ
if (area[nx][ny] != 0) continue; // ๋ฐฉ๋ฌธ ์ฌ๋ถ ๊ฒ์ฌ
if (a[x][y] & (1 << k)) continue; // ๋ฒฝ ๊ฒ์ฌ
q.push(make_pair(nx, ny));
area[nx][ny] = areaNum;
}
}
return cnt;
}
int main() {
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
// input
cin >> m >> n;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> a[i][j];
}
}
// ๊ตฌ์ญ ๊ฐ์
int areaNum = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (area[i][j] == 0) { // ๋ฐฉ๋ฌธํ์ง ์์๋ค๋ฉด
areaNum += 1;
areaSize[areaNum] = bfs(i, j, areaNum);
}
}
}
cout << areaNum << '\n';
// ๊ฐ์ฅ ๋์ ๋ฐฉ์ ๋์ด
int maxSize = 0;
for (int i = 1; i <= areaNum; i++) {
if (maxSize < areaSize[i]) {
maxSize = areaSize[i];
}
}
cout << maxSize << '\n';
// ํ๋์ ๋ฒฝ์ ์ ๊ฑฐํ์ฌ ์ป์ ์ ์๋ ๊ฐ์ฅ ๋์ ๋ฐฉ์ ํฌ๊ธฐ
int newMaxSize = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
int x = i;
int y = j;
for (int k = 0; k < 4; k++) {
int nx = x + dx[k];
int ny = y + dy[k];
if (nx < 0 || nx >= n || ny < 0 || ny >= m) continue;
if (area[nx][ny] == area[x][y]) continue; // ๊ฐ์ ๊ตฌ์ญ์ด๋ฉด ๋์ด๊ฐ๊ธฐ
if (a[x][y] & (1 << k)) {
if (newMaxSize < areaSize[area[x][y]] + areaSize[area[nx][ny]]) {
newMaxSize = areaSize[area[x][y]] + areaSize[area[nx][ny]];
}
}
}
}
}
cout << newMaxSize << '\n';
return 0;
}