Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Set
- 프로그래머스
- Sort
- 분할정복
- vector
- 에라토스테네스의 체
- 그래프
- 유클리드호제법
- 문자열
- 우선순위큐
- DP
- 다이나믹프로그래밍
- stoi
- N과M
- 정렬
- 티스토리챌린지
- BFS
- 백트래킹
- DFS
- 백준
- 배열
- 알고리즘
- priority_queue
- 오블완
- C++
- 최소공배수
- int
- 깊이우선탐색
- 이분탐색
- map
Archives
- Today
- Total
안녕 세상아,
[c++/백준] 4963 섬의 개수 (bfs) 본문
https://www.acmicpc.net/problem/4963
4963번: 섬의 개수
입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스의 첫째 줄에는 지도의 너비 w와 높이 h가 주어진다. w와 h는 50보다 작거나 같은 양의 정수이다. 둘째 줄부터 h개 줄에는 지도
www.acmicpc.net
전에는 4방 탐색을 풀었다면 이번에는 8방 탐색문제이다.
대각선까지 신경써줘야되기 때문에 좌표를 조금 더 생각해주면 된다.
좌표가 주어지는 것이 아닌 배열이 전체가 주어지기 때문에 배열 전체를 입력 받으면 된다.
#include <iostream>
#include <cstring>
using namespace std;
int map[51][51];
bool isVisited[51][51] = { false };
int w, h;
int dx[8] = { -1,0,1,-1,1,-1,0,1 };
int dy[8] = { 1,1,1,0,0,-1,-1,-1 };
void dfs(int x, int y) {
for (int i = 0; i < 8; i++) {
if (isVisited[x + dx[i]][y + dy[i]] == false && map[x + dx[i]][y + dy[i]] == 1) {
isVisited[x + dx[i]][y + dy[i]] = true;
dfs(x + dx[i], y + dy[i]);
}
}
}
int main() {
while (1) {
cin >> w >> h;
int cnt = 0;
if (w == 0 && h == 0) {
break;
}
for (int i = 0; i < h; i++) {
for (int j = 0; j < w; j++) {
cin >> map[i][j];
}
}
for (int x = 0; x < h; x++) {
for (int y = 0; y < w; y++) {
if (isVisited[x][y] == false && map[x][y] == 1) {
isVisited[x][y] = true;
dfs(x, y);
cnt++;
}
}
}
cout << cnt << '\n';
cnt = 0;
memset(isVisited, false, sizeof(isVisited));
memset(map, 0, sizeof(map));
}
return 0;
}
bfs보다 dfs가 더 쉬운듯,,,개인적인 의견
그래서 먼가 맨날 dfs로만 풀어 ㅋ bfs로도 풀어봐야되는디,,
'백준' 카테고리의 다른 글
[c++/백준] 11508 2+1 세일 (0) | 2023.06.17 |
---|---|
[c++/백준] 18870 좌표 압축 (0) | 2023.06.16 |
[c++/백준] 1012 유기농 배추 (0) | 2023.06.12 |
[c++/백준] 11279 최대 힙 (0) | 2023.06.12 |
[c++/백준] 14889 스타트와 링크 (0) | 2023.06.12 |