ABOUT ME

Today
Yesterday
Total
  • 백준 - Puyo Puyo [11559]
    공부/baekjoon 문제 2019. 6. 13. 15:19
    #include <iostream>
    #include <queue>
    
    using namespace std;
    char map[12][6];
    bool visit[12][6];
    bool check = false;
    int result = 0;
    
    void down(int i, int j) {
    	int top = i;
    	int bot = i;
    	int n = 0;
    
    	for (int l = i; l >= 0; l--) {
    		if (map[l][j] != '.') {
    			map[bot - n][j] = map[l][j];
    			map[l][j] = '.';
    			n++;
    		}
    	}
    
    }
    
    void boom(int i, int j) {
    	char name = map[i][j];
    
    	map[i][j] = '.';
    	
    	if (i > 0)
    		if (map[i - 1][j] == name)
    			boom(i - 1, j);
    	if (j > 0)
    		if (map[i][j - 1] == name)
    			boom(i, j - 1);
    	if (i < 11)
    		if (map[i + 1][j] == name)
    			boom(i + 1, j);
    	if (j < 5)
    		if (map[i][j + 1] == name)
    			boom(i, j + 1);
    
    }
    
    void bfs(int i, int j) {
    	queue<pair<int, int>> q;
    	pair<int, int> p;
    	int block = 0;
    
    
    	p.first = i;
    	p.second = j;
    	q.push(p);
    	char cur = map[i][j];
    	visit[i][j] = true;
    	block++;
    	while (!q.empty()) {
    
    		i = q.front().first;
    		j = q.front().second;
    
    		if (i > 0)
    			if (map[i - 1][j] == cur && !visit[i - 1][j]) {
    				p.first = i - 1;
    				p.second = j;
    				q.push(p);
    				visit[i - 1][j] = true;
    				block++;
    
    			}
    		if (j > 0)
    			if (map[i][j - 1] == cur && !visit[i][j - 1]) {
    				p.first = i;
    				p.second = j - 1;
    				q.push(p);
    				visit[i][j - 1] = true;
    				block++;
    
    			}
    		if (i < 11)
    			if (map[i + 1][j] == cur && !visit[i + 1][j]) {
    				p.first = i + 1;
    				p.second = j;
    				q.push(p);
    				visit[i + 1][j] = true;
    				block++;
    
    			}
    		if (j < 5)
    			if (map[i][j + 1] == cur && !visit[i][j + 1]) {
    				p.first = i;
    				p.second = j + 1;
    				q.push(p);
    				visit[i][j + 1] = true;
    				block++;
    
    			}
    
    		q.pop();
    
    	}
    
    	if (block > 3) {
    		boom(i, j);
    		check = true;
    	}
    
    }
    
    int main() {
    	char cur;
    
    	for (int i = 0; i < 12; i++)
    		for (int j = 0; j < 6; j++) {
    			cin >> map[i][j];
    			visit[i][j] = false;
    		}
    
    	while (true) {
    		check = false;
    		for (int i = 0; i < 12; i++) {
    			for (int j = 0; j < 6; j++) {
    				visit[i][j] = false;
    			}
    		}
    
    		for (int i = 0; i < 12; i++)
    			for (int j = 0; j < 6; j++) {
    				if (map[i][j] != '.' && !visit[i][j]) {
    					cur = map[i][j];
    					bfs(i, j);
    
    				}
    			}
    
    		if (!check) {
    			break;
    		}
    
    		result++;
    
    		for (int i = 11; i >= 0; i--) {
    			for (int j = 5; j >= 0; j--) {
    				if (map[i][j] == '.')
    					down(i, j);
    			}
    		}
    
    	}
    
    
    	cout << result;
    
    	return 0;
    }

    댓글

Designed by Tistory.