-

[BOJ]2136_DFS 본문

Algorithm/Baekjoon

[BOJ]2136_DFS

Boogallee 2019. 7. 10. 23:37

https://www.acmicpc.net/problem/2573

 

2573번: 빙산

첫 줄에는 이차원 배열의 행의 개수와 열의 개수를 나타내는 두 정수 N과 M이 한 개의 빈칸을 사이에 두고 주어진다. N과 M은 3 이상 300 이하이다. 그 다음 N개의 줄에는 각 줄마다 배열의 각 행을 나타내는 M개의 정수가 한 개의 빈 칸을 사이에 두고 주어진다. 각 칸에 들어가는 값은 0 이상 10 이하이다. 배열에서 빙산이 차지하는 칸의 개수, 즉, 1 이상의 정수가 들어가는 칸의 개수는 10,000 개 이하이다. 배열의 첫 번째 행과 열, 마지

www.acmicpc.net

 

핵심 로직은

 

map 에서 1이상을 가지는 값의 갯수를 저장해두고 사용한다.

 

DFS 순회를 할 때마다 4방향을 조사하여 0의 갯수만큼 차감해주고(마지막에 변환) 그 때 1 이상의 값의 갯수가

 

결국 다음 순회에서 방문하는 횟수와 같아야하는데 그게 다르면 갈라진 것!

 

break 를 하나 추가하지 않아서 엄청나게 틀렸다. 진짜 break 하나 차이로.

 

if(val < 0) 에서 val이 0 이면 해당 조건문을 false 로 통과해 버린다. 여기서 반례가 발생해 버리는 것.

 

 

#include <iostream>
#include <string.h>


using namespace std;
int n, m;
int map[301][301];
int v[301][301];

int px[4] = { -1 , 0 , 1 ,0 };
int py[4] = { 0,1,0,-1 };
int com = 0;
int flg = 0;


int dfs(int x, int y) {
	if (v[x][y] == 1) return 0;
	v[x][y] = 1;
	int ret = 0;
	int val = map[x][y];

	for (int z = 0; z < 4; z++) {
		int xx = x + px[z];
		int yy = y + py[z];
		if (xx < 0 || yy < 0 || xx >= n || yy >= m) continue;
		if (map[xx][yy] == 0) {
			if (val < 0) {
				val = 0;
				break;
			}
			val -= 1;
			if (val == 0) {
				com -= 1;
				break;
			}

		}

	}
	for (int i = 0; i < 4; i++) {
		int nx = x + px[i];
		int ny = y + py[i];

		if (nx < 0 || ny < 0 || nx >= n || ny >= m) continue;

		if (v[nx][ny] == 0 && map[nx][ny] > 0) {
			ret += dfs(nx, ny);
		}

	}

	map[x][y] = val;
	return ret + 1;
}

int main() {
	cin >> n >> m;

	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			cin >> map[i][j];
			if (map[i][j] != 0) {
				com++;
			}
		}
	}
	int cnt = 0;
	int get_cnt = 0;
	int rem = com;
	int stop = 0;
	int ans = 0;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			if (map[i][j] == 0 || v[i][j] == 1) continue;
			else if(map[i][j] > 0){
				
				get_cnt = dfs(i, j);
				cnt++;
				if (rem != get_cnt) {
					stop = 1;
					ans = cnt - 1;
					break;
				}
				memset(v, 0, sizeof(v));
				rem = com;
				

			}
			
		}
		if (stop) break;
	}

	if (stop) {
		cout << ans;
	}
	else {
		cout << 0;
	}
	return 0;
}

 

'Algorithm > Baekjoon' 카테고리의 다른 글

[BOJ]10825  (0) 2020.03.10
[BOJ]11004 - 퀵소트/퀵셀렉션/머지소트  (0) 2020.03.09
1890 점프  (0) 2018.02.12
2667 단지번호붙이기  (0) 2018.02.12
10216 Count Circle Group  (0) 2018.02.11
Comments