알고리즘/DFS | BFS

파이썬 | c++ | 백준 | 4963 | 섬의 개수 | del list

cha-n 2020. 10. 6. 13:50

# 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

 

4963번: 섬의 개수

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스의 첫째 줄에는 지도의 너비 w와 높이 h가 주어진다. w와 h는 50보다 작거나 같은 양의 정수이다. 둘째 줄부터 h개 줄에는 지도�

www.acmicpc.net