티스토리 뷰

알고리즘/백준

백준 / 11559 Puyo Puyo C++

4567은 소수 2021. 3. 7. 20:19

www.acmicpc.net/problem/11559

 

11559번: Puyo Puyo

총 12개의 줄에 필드의 정보가 주어지며, 각 줄에는 6개의 문자가 있다. 이때 .은 빈공간이고 .이 아닌것은 각각의 색깔의 뿌요를 나타낸다. R은 빨강, G는 초록, B는 파랑, P는 보라, Y는 노랑이다.

www.acmicpc.net

구현을 열심히하면 되는 문제였습니다. 뿌요뿌요 게임을 이용해 연속으로 몇 번 터질지 계산하면 됩니다.

주어진 입력에서 터지는 횟수가 0이면 게임이 종료되고, 아닌 경우 터트리고 뿌요들을 내리고를 반복하면 됩니다.

(메모리 초과가 처음에 떴는데 bfs에서 조건을 빼먹었었다. 꼼꼼히 하자!)

 

코드는 다음과 같습니다.

#include<iostream>
#include<vector>
#include<algorithm>
#include<cstring>
#include<queue>

using namespace std;

char map[12][6];
bool visited[12][6];
int dy[4] = { 0,0,1,-1 };
int dx[4] = { 1,-1,0,0 };

void make_map()
{
	for (int i = 0; i < 12; i++) {
		for (int j = 0; j < 6; j++) {
			cin >> map[i][j];
			visited[i][j] = false;
		}
	}
}

// 터질 수 있는 뿌요 있는 지 확인 
// y,x 와 연결된 것 중에 없으면 0, 있으면 1
// 맵 전체에서 돌려서 합 0이면 게임 스탑
int Pop(int Y, int X)
{
	if (map[Y][X] == '.')
		return 0;

	else {
		char Puyo = map[Y][X];
		queue<pair<int, int>>q;
		q.push({ Y, X });
		vector<pair<int, int>>v;

		while (!q.empty()) {
			int y = q.front().first;
			int x = q.front().second;
			q.pop();
			visited[y][x] = true;
			v.push_back({ y,x });

			for (int i = 0; i < 4; i++) {
				int ny = y + dy[i];
				int nx = x + dx[i];

				if (ny >= 0 && ny < 12 && nx >= 0 && nx < 6) {
					if (map[ny][nx] == Puyo && visited[ny][nx] == false) {
						q.push({ ny,nx });
					}
				}
			}
		}

		if (v.size() >= 4) {
			for (int i = 0; i < v.size(); i++) {
				int y = v[i].first;
				int x = v[i].second;
				map[y][x] = '.';
			}
			v.clear();
			return 1;
		}
		else {
			v.clear();
			return 0;
		}
	}
}

void down(int X)
{
	vector<char>v;
	for (int i = 11; i >= 0; i--) {
		if (map[i][X] != '.') {
			v.push_back(map[i][X]);
			map[i][X] = '.';
		}
	}

	int y = 11;
	for (int i = 0; i < v.size(); i++) {
		map[y][X] = v[i];
		y--;
	}
	v.clear();
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	make_map();

	int pop_cnt = 0;
	int result = 0;
	while (1) {

		pop_cnt = 0;
		for (int i = 0; i < 12; i++)
			for (int j = 0; j < 6; j++)
				visited[i][j] = false;

		for (int j = 0; j < 6; j++) {
			down(j);
		}

		for (int i = 11; i >= 0; i--) {
			for (int j = 0; j < 6; j++) {
				pop_cnt += Pop(i, j);
			}
		}

		if (pop_cnt > 0)
			result++;
		if (pop_cnt == 0)
			break;

	}

	cout << result;
}

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

백준 / 2533 사회망 서비스 C++  (0) 2021.03.08
백준 / 1069 집으로 python3  (0) 2021.03.07
백준 / 10422 괄호 C++  (1) 2021.03.05
백준 / 2252 줄 세우기 C++  (0) 2021.03.04
백준 / 1916 최소비용 구하기 C++  (0) 2021.03.02
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
TAG
more
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함