[백준/BOJ] 백준 4963번 : 섬의 개수
2020. 9. 24. 22:33ㆍ알고리즘 문제풀이
섬을 발견했을 때 해당 섬에 속한 땅을 모두 체크해서 같은 섬을 중복으로 세지 않고 섬의 개수를 구했다.
코드
#include <iostream>
#include <algorithm>
#include <utility>
using namespace std;
int w, h;
int board[50][50];
int check[50][50];
int dxdy[8][2] = { {0,-1},{-1,-1},{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1} };
void Pre()
{
for (int i = 0; i < 50; i++)
for (int j = 0; j < 50; j++)
check[i][j] = 0;
}
void Solve(pair<int, int> here)
{
check[here.first][here.second] = 1; //탐색한곳 체크
//here에서 갈 수 있고, 탐색하지 않은 땅을 탐색
for (int i = 0; i < 8; i++)
{
pair<int, int> there = make_pair(here.first + dxdy[i][0], here.second + dxdy[i][1]);
if (there.first >= 0 && there.first < h && there.second >= 0 && there.second < w && board[there.first][there.second] == 1 && check[there.first][there.second] == 0)
{
Solve(there);
}
}
}
int main()
{
cin.tie(NULL);
ios_base::sync_with_stdio(false);
int input;
int result;
while (1)
{
Pre();
result = 0;
cin >> w >> h;
if (w == 0 && h == 0)
break;
for (int i = 0; i < h; i++)
for (int j = 0; j < w; j++)
{
cin >> input;
board[i][j] = input;
}
for (int i = 0; i < h; i++)
for (int j = 0; j < w; j++)
{
//섬을 발견했을때
if (board[i][j] == 1 && check[i][j] == 0)
{
result++;
//해당섬에 속한 땅을 체크
Solve(make_pair(i, j));
}
}
cout << result << "\n";
}
return 0;
}
'알고리즘 문제풀이' 카테고리의 다른 글
[백준/BOJ] 백준 2748번 : 피보나치 수 2 (0) | 2020.09.25 |
---|---|
[백준/BOJ] 백준 16988번 : Baaaaaaaaaduk2 (Easy) (0) | 2020.09.25 |
[백준/BOJ] 백준 15681번 : 트리와 쿼리 (0) | 2020.09.24 |
[백준/BOJ] 백준 2533번 : 사회망 서비스(SNS) (0) | 2020.09.24 |
[백준/BOJ] 백준 13549번 : 숨바꼭질 3 (0) | 2020.09.24 |