PS(구 C++)
백준 2234 성곽 C++
같이긍뱅와
2022. 2. 1. 18:58
#include<bits/stdc++.h>
#define MAX 50
using namespace std;
int N, M;
int MAP[MAX][MAX];
bool chk[MAX][MAX];
int dx[] = { 0, -1, 0, 1 };
int dy[] = { -1, 0, 1, 0 };
int BFS(int a, int b){
int roomSize = 0;
queue<pair<int, int>> Q;
Q.emplace(a, b);
chk[a][b] = true;
roomSize++;
while (!Q.empty()){
int x = Q.front().first;
int y = Q.front().second;
Q.pop();
int w = 1;
for (int i = 0; i < 4; i++){
if ((MAP[x][y] & w) != w){
int nx = x + dx[i];
int ny = y + dy[i];
if (nx >= 0 && ny >= 0 && nx < N && ny < M){
if (!chk[nx][ny]){
roomSize++;
chk[nx][ny] = true;
Q.emplace(nx, ny);
}
}
}
w = w * 2;
}
}
return roomSize;
}
int main(void){
ios::sync_with_stdio(false);
cin.tie(NULL);
cin >> M >> N;
for (int i = 0; i < N; i++){
for (int j = 0; j < M; j++)
cin >> MAP[i][j];
}
int Room_Cnt = 0;
int biggest = 0;
for (int i = 0; i < N; i++){
for (int j = 0; j < M; j++){
if (chk[i][j] == false){
biggest = max(biggest, BFS(i,j));
Room_Cnt++;
}
}
}
cout << Room_Cnt << '\n';
cout << biggest << '\n';
for (int i = 0; i < N; i++){
for (int j = 0; j < M; j++){
for (int w = 1; w <= 8; w *= 2){
if ((MAP[i][j] & w) == w){
memset(chk, false, sizeof(chk));
MAP[i][j] = MAP[i][j] - w;
biggest = max(biggest, BFS(i, j));
MAP[i][j] = MAP[i][j] + w;
}
}
}
}
cout << biggest;
return 0;
}