# 4963, 섬의 개수
import sys
sys.setrecursionlimit(10000)
dx = [-1, -1, -1, 0, 0, 1, 1, 1]
dy = [1, 0, -1, 1, -1, 1, 0, -1]
def dfs(x, y):
visited[x][y] = 1
for i in range(8):
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx < h and 0 <= ny < w:
if visited[nx][ny] == 0 and map[nx][ny] == 1:
dfs(nx, ny)
while True:
w, h = map(int, sys.stdin.readline().split())
if w == 0 and h == 0:
sys.exit()
map = [list(map(int, sys.stdin.readline().split())) for _ in range(h)]
visited = [[0]*w for _ in range(h)]
cnt = 0
for i in range(h):
for j in range(w):
if map[i][j] == 1 and visited[i][j] == 0:
dfs(i, j)
cnt += 1
print(cnt)
del map
지도 입력 변수 명으로 map 사용 X. 할거면 del map
# del map
#include <iostream>
#include <vector>
using namespace std;
int dx[] = { -1, -1, -1, 0, 0, 1, 1, 1 };
int dy[] = { 1, 0, -1, 1, -1, 1, 0, -1 };
int w, h;
vector<vector<int>> map;
vector<vector<int>> visited;
void dfs(int x, int y) {
visited[x][y] = 1;
for (int i = 0; i < 8; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if (nx < 0 || nx >= h || ny < 0 || ny >= w)
continue;
else {
if (map[nx][ny] == 1 && visited[nx][ny] == 0)
dfs(nx, ny);
}
}
}
int main()
{
//int w, h;
while (true) {
cin >> w >> h;
if (w == 0 && h == 0) {
break;
}
for (int i = 0; i < h; i++) {
vector<int> map_row;
vector<int> visited_row;
for (int j = 0; j < w; j++) {
int num;
cin >> num;
map_row.push_back(num);
visited_row.push_back(0);
}
map.push_back(map_row);
visited.push_back(visited_row);
}
int cnt = 0;
for (int i = 0; i < map.size(); i++) {
for (int j = 0; j < map[i].size(); j++) {
if (map[i][j] == 1 && visited[i][j] == 0) {
cnt++;
dfs(i, j);
}
}
}
cout << cnt << endl;
map.clear();
visited.clear();
}
}
문제 출처 www.acmicpc.net/problem/4963
'알고리즘 > DFS | BFS' 카테고리의 다른 글
파이썬 | 백준 | 2573 | 빙산 (0) | 2020.11.03 |
---|---|
C++ | 백준 | 1325 | 효율적인 해킹 (0) | 2020.10.22 |
파이썬 | 백준 | 1743 | 음식물 피하기 (0) | 2020.10.04 |
파이썬 | 백준 | 2458 | 키 순서 (0) | 2020.09.29 |
파이썬 | 백준 | 6593 | 상범 빌딩 (0) | 2020.09.26 |