https://www.acmicpc.net/problem/20061
#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 |