그래프
로 푸는 문제. 난 DFS
로 풀었다.
w
와 h
가 둘 다 0
일 때까지 반복한다.map
을 초기화하고, map[i][j]
가 1
일 때 DFS
를 호출한다.visit[y][x]==1
) return 0;1
이라면 그 땅에서 다시 DFS
호출해준다.answer
에 더해준다.#include <iostream>
#include <vector>
using namespace std;
int dy[8] = { -1,0,1,0,-1,-1,1,1 };
int dx[8] = { 0,1,0,-1,-1,1,-1,1 };
vector<vector<int>> map;
vector<vector<int>> visit;
int w, h;
int DFS(int y, int x)
{
if (visit[y][x]) return 0;
visit[y][x] = 1;
for (int i = 0; i < 8; i++)
{
int ny = y + dy[i];
int nx = x + dx[i];
if (ny < 0 || ny >= h || nx < 0 || nx >= w) continue; // 범위 밖이면
if (visit[ny][nx]) continue; // 방문했으면
if (map[ny][nx] == 1)
{
DFS(ny, nx);
}
}
return 1;
}
int main(void)
{
while (1)
{
cin >> w >> h;
if (w == 0 && h == 0) break;
map.resize(h, vector<int>(w));
visit.resize(h, vector<int>(w));
for (int i = 0; i < h; i++)
{
for (int j = 0; j < w; j++)
{
cin >> map[i][j];
}
}
int answer = 0;
for (int i = 0; i < h; i++)
{
for (int j = 0; j < w; j++)
{
if (map[i][j] == 1)
{
answer += DFS(i, j);
}
}
}
cout << answer << endl;
map.clear();
visit.clear();
}
}