白駿2468


標準2468:安全区域

  • アレイの最大値を求めて、
  • 1から求める最大値に従ってDFSを迂回し、各セーフティエリアの数
  • を得る.
  • 2出力の結果の中で最も高い代価の値は
  • である.
    正しいコード
    #include <bits/stdc++.h>
    
    using namespace std;
    
    int n;
    int a[101][101], visited[101][101];
    int m=-1, arr_max=-1;
    
    int dy[4] = {-1,0,1,0}, dx[4] = {0,1,0,-1};
    int ny, nx;
    
    void dfs(int y, int x, int h) {
    	visited[y][x]=1;
    	for(int i=0; i<4; i++) {
    		ny = y+dy[i];
    		nx = x+dx[i];
    		if(ny<0 || nx<0 || ny>=n || nx>=n) { //배열 벗어나는 경우 
    			continue;
    		}
    		if(!visited[ny][nx] && a[ny][nx]>h) {
    			dfs(ny, nx, h);
    		}
    	}
    	
    	return;
    }
    
    int main() {
    	ios_base::sync_with_stdio(false);
    	cin.tie(NULL);
    	cout.tie(NULL);
    	
    	cin>>n;
    	for(int i=0; i<n; i++) {
    		for(int j=0; j<n; j++) {
    			cin>>a[i][j];
    		}
    	}
    	
    	//먼저 최댓값을 구해야 함
    	for(int i=0; i<n; i++) {
    		for(int j=0; j<n; j++) {
    			if(a[i][j]>arr_max) {
    				arr_max = a[i][j];
    			}
    		}
    	}
    	
    	while(arr_max--) {
    		fill(&visited[0][0], &visited[0][0]+101*101, 0);
    		int cnt=0;
    		
    		for(int i=0; i<n; i++) {
    			for(int j=0; j<n; j++) {
    				if(a[i][j]>arr_max && !visited[i][j]) {
    					cnt++;
    					dfs(i, j, arr_max);
    				}
    			}
    		}
    		
    		if(cnt>m) {
    			m=cnt;
    		}
    	}
    	
    	cout<<m<<'\n';
    	
    	
    	return 0;
    }
    アクセスする配列とcnt値を各ループに初期化することを忘れないでください.