๐ค๋ฌธ์ ์ดํด
๋ฌธ์ ์์ ์๊ตฌํ๋ 1,2,3๋ฒ์ ๊ณ์ฐํ๋ ๋ฒฝ์ ๋ํ ์ ๋ณด๊ฐ 1, 2, 4, 8๋ก ์ฃผ์ด์ง๋ ๊ฒ์ผ๋ก ๋ณด์ ๋นํธ๋ง์คํน์ ์ฌ์ฉํ๋ฉด ๋๋ ๋ฌธ์ ์ด๋ค.
๐ฅํ์ด๐ฅ
๊ฐ๋จํ BFS๋ฅผ ์ํํ๋ ๋ฒฝ์ ์ ๋ณด๋ฅผ ๋นํธ ์ฐ์ฐ์ผ๋ก ์ฒ๋ฆฌํด์ฃผ์๋ค.
((1 << i) & map[y][x]) == 0)๋ BFS ํจ์์์ ์ผ์ชฝ,์ค๋ฅธ์ชฝ,์,์๋๋ก ์ด๋ํ๊ธฐ ์ ์ ๊ทธ ๋ฐฉํฅ์ ๋ฒฝ์ด ์๋์ง๋ฅผ ํ์ธํด์ฃผ๋ ์ฝ๋์ด๋ค.
3๋ฒ์ ๊ณ์ฐํ ๋์๋ map[i][j] = map[i][j] & ~(1 << k)์์ ์ด์ฉํด ๋ฒฝ์ ํ๋์ฉ ์์ค ์ ๋ณด๋ฅผ map์ ์ ๋ฐ์ดํธ ์์ผ์ฃผ๊ณ BFS๋ฅผ ๋๋ฆฐ ํ map๊ฐ์ ์ด๊ธฐ ์ํ๋ก ๋๋ ค์ฃผ๋ ๋ฐฉ์์ ์ฌ์ฉํ๋ค.
โํธ๋ฌ๋ธ ์ํ
BFS๋ฅผ ๋๊ธฐ ์ ์์์ ์ visited์ฒ๋ฆฌ๋ฅผ ํด์ฃผ๋ ๊ฒ์ ๊น๋นกํด ์ค๋ฅ๋ฅผ ์ฐพ๋๊ฒ ์๊ฐ์ด ์ค๋๊ฑธ๋ ธ๋ค.
์ปดํ์ผ ์๋ฌ์ ๊ฒฝ์ฐ memset ํจ์๋ฅผ ์ฌ์ฉํ๋๋ฐ <cstring>ํค๋๋ฅผ ๋นผ๋จน์๊ธฐ ๋๋ฌธ์ด๋ค.
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
int n, m;
int map[51][51];
bool visited[51][51];
int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, -1, 0, 1};
queue<pair<int, int>> q;
int max_room;
int remove_max_room;
int cnt;
int room_size;
bool isValid(int y, int x) {
return y < m && y >= 0 && x < n && x >= 0 && !visited[y][x];
}
void BFS() {
while (!q.empty()) {
int y = q.front().first;
int x = q.front().second;
q.pop();
room_size++;
for (int i = 0; i < 4; i++) {
if (((1 << i) & map[y][x]) == 0) {
int mv_y = y + dy[i];
int mv_x = x + dx[i];
if (isValid(mv_y, mv_x)) {
q.push({mv_y, mv_x});
visited[mv_y][mv_x] = true;
}
}
}
}
}
int main() {
cin.tie(nullptr);
cout.tie(nullptr);
ios::sync_with_stdio(false);
cin >> n >> m;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
cin >> map[i][j];
}
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (!visited[i][j]) {
visited[i][j] = true;
cnt++;
q.push({i, j});
room_size = 0;
BFS();
if (max_room < room_size) max_room = room_size;
}
}
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
for (int k = 0; k < 4; k++) {
memset(visited, false, sizeof(visited));
int tmp = map[i][j];
map[i][j] = map[i][j] & ~(1 << k);
q.push({i, j});
room_size = 0;
visited[i][j] = true;
BFS();
remove_max_room = remove_max_room < room_size ? room_size : remove_max_room;
map[i][j] = tmp;
}
}
}
cout << cnt << "\n" << max_room << "\n" << remove_max_room;
}
'๋ฐฑ์ค > C++' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค/C++] 1149๋ฒ RGB๊ฑฐ๋ฆฌ (0) | 2022.07.16 |
---|---|
[๋ฐฑ์ค/C++] 18352 ํน์ ๊ฑฐ๋ฆฌ์ ๋์ ์ฐพ๊ธฐ (0) | 2022.07.16 |
[๋ฐฑ์ค/C++] 2252๋ฒ ์ค ์ธ์ฐ๊ธฐ (0) | 2022.07.16 |
[๋ฐฑ์ค/C++] 2056๋ฒ ์์ (0) | 2022.07.16 |
[๋ฐฑ์ค/C++] 1162๋ฒ ๋๋กํฌ์ฅ (0) | 2022.07.16 |