본문 바로가기
카테고리 없음

백준 11559 Puyo Puyo(시뮬+dfs?)

by zieunee 2020. 5. 8.
반응형

https://www.acmicpc.net/problem/11559

 

11559번: Puyo Puyo

현재 주어진 상황에서 몇연쇄가 되는지 출력하라. (하나도 터지지 않는다면 0을 출력하면 된다.)

www.acmicpc.net

게임으로만 하던 걸 소스로 짜다니 신기

//puyopuyo
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
#include<string.h>
#include<vector>
using namespace std;
char map[13][7];
int visited[13][17];
int flag; //flag 0 > 더이상 터질것 없음  1 : 터질것 있음 
int cnt;
int dy[4] = { 1, 0, -1, 0 };
int dx[4] = { 0, 1, 0, -1 };
int flagBom;
vector<char> v;
vector<pair<int, int>> loc;
int num;
void down() {
	for (int i = 0; i < 6; i++) {
		for (int j = 0; j < 12; j++) {
			if (map[j][i] != '.') {
				v.push_back(map[j][i]);
				map[j][i] = '.';
			}
		}
		int col = 11;
		for (int z = v.size() - 1; z >= 0; z--) {
			map[col][i] = v[z];
			col--;
		}

		v.clear();
	}
}
void bom(char color,int x, int y) {
	loc.push_back(make_pair(x, y));
	if (num == 4) {
		//cnt++;
		flagBom = 1;
		flag = 1;
	}
	for (int i = 0; i < 4; i++) {
		int nx = x + dx[i];
		int ny = y + dy[i];	
		if (map[nx][ny] == color && visited[nx][ny] == 0) {
			visited[nx][ny] = 1;
			num = num + 1;
			bom(color, nx, ny);
		}

	}

}
int main() {
	for (int i = 0; i < 12; i++) {
			scanf("%s",&map[i]);
		for(int j = 0; j < 6; j++) {
		}
	}
	flag = 1;
	cnt = 0;

	while (1) {
	
		flag = 0;

		while (1) {
			flagBom = 0;
			memset(visited, 0, sizeof(visited));
			for (int i = 0; i < 12; i++) {
				for (int j = 0; j < 6; j++) {
					if (map[i][j] != '.' && visited[i][j] == 0) {
						flagBom = 0;
						visited[i][j] = 1;
						bom(map[i][j], i, j);
						if (flagBom == 1) {
							for (int a = 0; a < loc.size(); a++) {
								map[loc[a].first][loc[a].second] = '.';
							}
						}
						num = 1;
						loc.clear();
					}
				}
			}
			if (flagBom == 0) break;
		}
		if (flag == 0) break;
		cnt++;
		down();
	}

	printf("%d", cnt);
}
반응형