← Back to List

2638번: 치즈 ↗

Solutions

C++14
1023 B | 1023 chars
#include <iostream>

using namespace std;

int N,M,ar[220][220],ans,cnt;
int dx[] = {1,-1,0,0};
int dy[] = {0,0,-1,1};

void f(int y,int x) {
	if(ar[y][x]==0) {
        ar[y][x]=2;
        for(int d = 0; d<4; d++) {
            int next_y = y+dy[d];
            int next_x = x+dx[d];
            if(next_y<0 || next_x <0 || next_y >=N || next_x >= M) continue;
            if(ar[next_y][next_x] != 0) continue;
            f(next_y,next_x);
        }
	}
}
int main() {
	cin >> N >> M;
	for(int y=0; y<N; y++) {
		for(int x=0; x<M; x++) {
			cin >> ar[y][x];
			if(ar[y][x]==1) cnt++;
		}
	}

	while(cnt>0) {
		ans++;
		f(0,0);
		
		for(int y=1; y<N-1; y++)
			for(int x=1; x<M-1; x++) {
				if(ar[y][x] == 1) {
					int k = 0;
					if(ar[y+1][x] == 2) k++;
					if(ar[y-1][x] == 2) k++;
					if(ar[y][x+1] == 2) k++;
					if(ar[y][x-1] == 2) k++;

					if(k>=2) {
						ar[y][x] = 0;
						cnt--;
					}

				}
			} 
		for(int y=0; y<N; y++)
			for(int x=0; x<M; x++) 
				if(ar[y][x] == 2) ar[y][x] = 0;
	}
	cout << ans;
}