ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 미네랄
    백준알고리즘 2019. 9. 10. 01:54

    #include <iostream>
    #include <string.h>
    #include <queue>
    using namespace std;
    
    int r, c;
    char map[111][111];
    bool dist[111][111];
    int dx[4] = { -1, 1 , 0 , 0 };
    int dy[4] = { 0, 0, -1, 1 };
    
    int main() {
    	ios::sync_with_stdio(false);
    	cin >> r >> c;
    	for (int i = 1; i <= r; i++) {
    		for (int j = 1; j <= c; j++) {
    			cin >> map[i][j];
    		}
    	}
    	int n;
    	cin >> n;
    	bool left = true;
    	while (n--) {
    		int height;
    		cin >> height;
    		height = r - height + 1;
    		// del
    		if (left == true) {
    			for (int i = 1; i <= c; i++) {
    				if (map[height][i] == 'x') {
    					map[height][i] = '.';
    					break;
    				}
    			}
    		}
    		else {
    			for (int i = c; i >= 1; i--) {
    				if (map[height][i] == 'x') {
    					map[height][i] = '.';
    					break;
    				}
    			}
    		}
    		left = !left;
    
    		// check
    		memset(dist, false, sizeof(dist));
    		for (int j = 1; j <= c; j++) {
    			if (map[r][j] == 'x') {
    				queue<pair<int, int> > q;
    				q.push(make_pair(r, j));
    				dist[r][j] = true;
    				while (!q.empty()) {
    					int x = q.front().first;
    					int y = q.front().second;
    					q.pop();
    					for (int k = 0; k < 4; k++) {
    						int nx = x + dx[k];
    						int ny = y + dy[k];
    						if (nx >= 1 && nx <= r && ny >= 1 && ny <= c) {
    							if (!dist[nx][ny] && map[nx][ny] == 'x') {
    								dist[nx][ny] = true;
    								q.push(make_pair(nx, ny));
    							}
    						}
    					}
    				}
    			}
    		}
    
    		int down = r;
    		for (int j = 1; j <= c; j++) {
    			for (int i = r; i >= 1; i--) {
    				if (map[i][j] == 'x' && dist[i][j] == false) {
    					int col = r - i;
    					for (int k = i + 1; k <= r; k++) {
    						if (dist[k][j] == true) {
    							col = k - i - 1;
    							break;
    						}
    					}
    					if (down > col) {
    						down = col;
    					}
    				}
    			}
    		}
    		for (int j = 1; j <= c; j++) {
    			for (int i = r; i >= 1; i--) {
    				if (i + down <= r && down != 0 && map[i][j] == 'x' && dist[i][j] == false) {
    					map[i + down][j] = map[i][j];
    					map[i][j] = '.';
    				}
    			}
    		}
    	}
    
    	for (int i = 1; i <= r; i++) {
    		for (int j = 1; j <= c; j++) {
    			cout << map[i][j];
    		}
    		cout << '\n';
    	}
    	return 0;
    }

    풀면서 진짜 구현하기 복잡했던 문제가 아닌가 싶다.

    처음 막대로인해 맵이사라지는거까지는 기초적인부분이라 어렵지않았지만, 망설여지고 어려웠던부분은 아무래도

    클러스터들이 나뉘는 기준과 내려갈때 클러스터 단위로 내려와서 다른하나가 다른클러스터에 닿으면 멈춰야한다는점이 구현하기 어려웠던것같다.

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

    텀 프로젝트  (0) 2019.09.16
    나무 재테크  (0) 2019.09.10
    효율적인 해킹  (0) 2019.09.09
    쇠막대기  (0) 2019.09.08
    상근이의 여행  (0) 2019.09.08

    댓글

Designed by Tistory.