728x90
반응형
문제
https://www.acmicpc.net/problem/4963
접근 방식
- BFS로 영역나누기, 8방향 검사
코드
#include <iostream>
#include <utility>
#include <queue>
#include <cstring>
using namespace std;
int main() {
int w = 1, h = 1;
queue<pair<int, int>> q;
int direc[8][2] = { {0, 1}, {1, 1}, {1, 0}, {1, -1}, {0, -1}, {-1, -1}, {-1, 0}, {-1, 1} };
int visit_value, _x, _y;
pair<int, int> front;
while (true) {
cin >> w >> h;
if (w + h == 0){
break;
}
int** _map = new int* [h];
int** visit = new int* [h];
for (int i = 0; i < h; i++) {
_map[i] = new int[w];
visit[i] = new int[w];
memset(visit[i], 0, sizeof(int) * w);
}
for (int i = 0; i < h; i++) {
for (int j = 0; j < w; j++) {
cin >> _map[i][j];
}
}
visit_value = 0;
for (int i = 0; i < h; i++) {
for (int j = 0; j < w; j++) {
if (visit[i][j] == 0 && _map[i][j] == 1) {
q.push({ i, j });
visit[i][j] = ++visit_value;
}
while (!q.empty()) {
front = q.front();
q.pop();
for (int i = 0; i < 8; i++) {
_x = front.first + direc[i][0];
_y = front.second + direc[i][1];
if (_x >= h || _x < 0) {
continue;
}
if (_y >= w || _y < 0) {
continue;
}
if (visit[_x][_y] != 0) {
continue;
}
if (_map[_x][_y] != 1) {
continue;
}
visit[_x][_y] = visit_value;
q.push({ _x, _y });
}
}
}
}
cout << visit_value << "\n";
while (!q.empty()) {
q.pop();
}
for (int i = 0; i < h; i++) {
delete(_map[i]);
delete(visit[i]);
}
}
return 0;
}
결과
728x90
반응형
'코딩테스트 > 백준' 카테고리의 다른 글
[백준] 14502번 - 연구소 (골드 5) (0) | 2022.04.21 |
---|---|
[백준] 1874번 - 스택 수열 (실버 3) (0) | 2022.04.19 |
[백준] 1920번 - 수 찾기 (실버 4) (0) | 2022.04.04 |
[백준] 1463번 - 1로 만들기 (실버 3) (0) | 2022.04.04 |
[백준] 10026번 - 적록색약 (골드 5) (0) | 2022.04.04 |
[백준] 10773번 - 제로 (실버 4) (0) | 2022.03.15 |
댓글