하루하나코딩

백준 2468번 : 안전영역 c++

HAHAKO 2023. 1. 5. 16:54

코드

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

using namespace std;

int N;
int map[101][101];
bool visit[101][101];
bool sink[101][101];
int dx[4] = {-1, 1, 0, 0};
int dy[4] = {0, 0, -1, 1}; 


void dfs(int a, int b){
	visit[a][b] = true;
	int nextx, nexty;
	
	for(int i = 0; i < 4; i++){
		nextx = a + dx[i];
		nexty = b + dy[i];
		
		if(nextx >=0 && nextx < N && nexty >= 0 && nexty < N){
			if(visit[nextx][nexty] == false && sink[nextx][nexty] == false){
				visit[nextx][nexty] = false;
				dfs(nextx, nexty);
			}
		}
	}
}



int main(){
	
	
	cin >> N;
	for(int i = 0; i < 101; i++){
		memset(map[i], 0, sizeof(map[i]));
		memset(visit[i], false, sizeof(visit[i]));
		memset(sink[i], false, sizeof(sink[i]));
	}
	
	for(int i = 0; i < N; i++){
		for(int j = 0; j < N; j++){
			cin >> map[i][j];
		}
	}
	
	int ans[101];
	ans[0] = 1;
	bool chk = false;
	int l = 1;
	while(!chk){

		int a = 0;
		int s = 0;
		for(int i = 0; i < N; i++){
			for(int j = 0; j < N; j++){
				visit[i][j] = false;
				if(map[i][j] - 1 >= 0) map[i][j]--;
				else map[i][j] = 0;
			}
		}
		
		for(int i = 0; i < N; i++){
			for(int j = 0; j < N; j++){
				if(map[i][j] == 0) sink[i][j] = true;
				if(sink[i][j] == true) s++;
			}
		}
		if(s == N*N) chk = true;
		
		for(int i = 0; i < N; i++){
			for(int j = 0; j < N; j++){
				if(sink[i][j] == false && visit[i][j] == false){
					dfs(i, j);
					a++;
				}
			}
		}
		ans[l] = a;
		l++;
	}
	
	int max;
	max = 0;
	for(int i = 0; i < l; i++){
		if( ans[i]> max){
			max = ans[i];	
		}
	}
	
	cout << max;
	
	return 0;
}

해결방법

sink를 정의해서 잠기지 않은곳만 탐색해서 개수를 셉니다.

비가 하나도 안올때도 생각해야해서 ans[0]에는 1을 넣어야 합니다!