본문 바로가기
백준 알고리즘/구현

모노미노도미노 2

by paysmile 2021. 10. 15.

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

 

20061번: 모노미노도미노 2

모노미노도미노는 아래와 같이 생긴 보드에서 진행되는 게임이다. 보드는 빨간색 보드, 파란색 보드, 초록색 보드가 그림과 같이 붙어있는 형태이다. 게임에서 사용하는 좌표 (x, y)에서 x는 행,

www.acmicpc.net

 

#include <iostream>
#include <cstring>

using namespace std;
int red[4][4];
int blue[4][6];
int green[6][4];
int n;
int answer = 0;

pair<int, int> MoveToBlue(int x, int y) {
	int i = x;
	int j = 0;
	for (; j < 6; j++) {
		if (blue[i][j] == 1) {
			j--;
			break;
		}
	}
	if (j == 6)	j = 5;
	return make_pair(i, j);
}

pair<int, int> MoveToGreen(int x, int y) {
	int i = 0;
	int j = y;
	for (; i < 6; i++) {
		if (green[i][j] == 1) {
			i--;
			break;
		}
	}
	if (i == 6)	i = 5;
	return make_pair(i, j);
}

void MoveToDown(int index) {
	for (int i = index; i > 0; i--) {
		for (int j = 0; j < 4; j++) {
			green[i][j] = green[i - 1][j];
		}
	}

	for (int i = 0; i < 4; i++) {
		green[0][i] = 0;
	}
}

void MoveToRight(int index) {
	for (int j = index; j >0; j--) {
		for (int i = 0; i < 4; i++) {
			blue[i][j] = blue[i][j - 1];
		}
	}

	for (int i = 0; i < 4; i++) {
		blue[i][0] = 0;
	}
}

void GetGrade() {
	for (int i = 0; i < 6; i++) {
		int count = 0;
		for (int j = 0; j < 4; j++) {
			if (green[i][j] == 1)	count++;
		}
		if (count == 4) {
			answer++;
			MoveToDown(i);
		}
	}

	for (int j = 0; j < 6; j++) {
		int count = 0;
		for (int i = 0; i < 4; i++) {
			if (blue[i][j] == 1)	count++;
		}
		if (count == 4) {
			answer++;
			MoveToRight(j);
		}
	}
}

void EraseBlock() {
	for (int i = 0; i < 2; i++) {
		int count = 0;
		for (int j = 0; j < 4; j++) {
			if (green[i][j] == 1)	count++;
		}
		if (count > 0) {
			MoveToDown(5);
		}
	}

	for (int j = 0; j < 2; j++) {
		int count = 0;
		for (int i = 0; i < 4; i++) {
			if (blue[i][j] == 1)	count++;
		}
		if (count > 0) {
			MoveToRight(5);
		}
	}
}

int main(void) {
	memset(red, 0, sizeof(red));
	memset(blue, 0, sizeof(blue));
	memset(green, 0, sizeof(green));

	cin >> n;

	for (int i = 0; i < n; i++) {
		int t, x, y;
		cin >> t >> x >> y;

		if (t == 1) {
			pair<int,int> tmp = MoveToBlue(x,y);
			blue[tmp.first][tmp.second] = 1;
			tmp = MoveToGreen(x, y);
			green[tmp.first][tmp.second] = 1;
		}
		else if (t == 2) {
			//블루는 한번만
			pair<int, int> tmp = MoveToBlue(x, y+1);
			blue[tmp.first][tmp.second] = 1;
			blue[tmp.first][tmp.second - 1] = 1;
			//그린은 행이 더 작은 애로(두번)
			tmp = MoveToGreen(x, y);
			pair<int, int> tmp2 = MoveToGreen(x, y + 1);
			if (tmp.first <= tmp2.first) {
				green[tmp.first][tmp.second] = 1;
				green[tmp.first][tmp2.second] = 1;
			}
			else {
				green[tmp2.first][tmp.second] = 1;
				green[tmp2.first][tmp2.second] = 1;
			}
		}
		else if (t == 3) {
			//블루는 열이 더 작은애로(두번)
			pair<int, int> tmp = MoveToBlue(x, y);
			pair<int, int> tmp2 = MoveToBlue(x + 1, y);
			if (tmp.second <= tmp2.second) {
				blue[tmp.first][tmp.second] = 1;
				blue[tmp2.first][tmp.second] = 1;
			}
			else {
				blue[tmp.first][tmp2.second] = 1;
				blue[tmp2.first][tmp2.second] = 1;
			}
			//그린은 한번만
			tmp = MoveToGreen(x + 1, y);
			green[tmp.first][tmp.second] = 1;
			green[tmp.first-1][tmp.second] = 1;
		}
		GetGrade();
		EraseBlock();
	}

	cout << answer << endl;
	answer = 0;
	for (int i = 0; i < 4; i++) {
		for (int j = 0; j < 6; j++) {
			if (blue[i][j] == 1)	answer++;
		}
	}
	for (int i = 0; i < 6; i++) {
		for (int j = 0; j < 4; j++) {
			if (green[i][j] == 1)	answer++;
		}
	}
	cout << answer << endl;
}

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

게리멘더링 2 C++  (0) 2021.10.17
주사위 윷놀이 C++  (0) 2021.10.16
청소년 상어 C++  (0) 2021.10.14
파이프 옮기기 C++  (0) 2021.10.14
파이프 옮기기 1 C++  (0) 2021.10.13