ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 인구 이동
    백준알고리즘 2019. 7. 17. 23:42
    
    #include<cstdio>
    #include<cstdlib>
    #include<iostream>
    #include<queue>
    #include<vector>
    #include<utility>
    using namespace std;
    
    int N, L, R;
    int a[50][50];
    int d[50][50];
    bool f[50][50];
    
    int dx[] = { 0,0,1,-1 };
    int dy[] = { 1,-1,0,0 };
    int alp = 0;
    
    int mon(int a, int b) {
    	int x = a - b;
    	int y = b - a;
    	if (x < 0)
    		return y;
    	else return x;
    }
    
    void bfs(int x, int y, int recent ) {
    	vector<pair<int, int>> v;
    	queue<pair<int, int>> q;
    	q.push(make_pair(x, y));
    	v.push_back(make_pair(x, y));
    	int sum = a[x][y];
    	d[x][y] = recent;
    	f[x][y] = true;
    	while (!q.empty()) {
    		x = q.front().first; y = q.front().second;
    		q.pop();
    		for (int i = 0; i < 4; i++) {
    			int nx = x + dx[i]; int ny = y + dy[i];
    			if (nx >= 0 && nx < N && ny >= 0 && ny < N) {
    				if (f[nx][ny] == false) {
    					int diff = (a[x][y] - a[nx][ny]);
    					if (diff < 0) diff = -1 * diff;
    					if(diff >= L && diff <= R){
    						d[nx][ny] = recent;
    						f[nx][ny] = true;
    						sum += a[nx][ny];
    						v.push_back(make_pair(nx, ny));
    						q.push(make_pair(nx, ny));
    					}
    				}
    			}
    
    		}
    	}
    	if (v.size() == 1) {
    		return;
    	}
    	else {
    		for (int i = 0; i < v.size(); i++) {
    			x = v[i].first; y = v[i].second;
    			a[x][y] = sum / v.size();
    		}
    	}
    }
    
    void initial() {
    	for (int i = 0; i < 50; i++) {
    		for (int j = 0; j < 50; j++) {
    			d[i][j] = 0;
    			f[i][j] = false;
    		}
    	}
    }
    
    int main() {
    	scanf("%d %d %d", &N, &L, &R);
    	for (int i = 0; i < N; i++) {
    		for (int j = 0; j < N; j++) {
    			scanf("%d", &a[i][j]);
    		}
    	}
    	int recent = 0;
    	bool top = false;
    	while (recent < N * N) {
    		recent = 0;
    		for (int i = 0; i < N; i++) {
    			for (int j = 0; j < N; j++) {
    				if (f[i][j] == false) {
    					bfs(i, j, recent);
    					recent++;
    				}
    			}
    		}
    		if (top == true)
    			alp++;
    		top = true;
    		initial();
    	}
    
    	cout << alp<<endl;
    	return 0;
    }

    BFS로 풀이했다, DFS로 해도괜찮았을듯.. 시간이 좀 걸렸던거같은데, 어렵진않았음

    '백준알고리즘' 카테고리의 다른 글

    테트로미노  (0) 2019.07.21
    안전영역  (0) 2019.07.20
    영역 구하기  (0) 2019.07.17
    보물섬  (0) 2019.07.17
    시험 감독  (0) 2019.07.17

    댓글

Designed by Tistory.