티스토리 뷰
https://www.acmicpc.net/problem/20061
20061번: 모노미노도미노 2
모노미노도미노는 아래와 같이 생긴 보드에서 진행되는 게임이다. 보드는 빨간색 보드, 파란색 보드, 초록색 보드가 그림과 같이 붙어있는 형태이다. 게임에서 사용하는 좌표 (x, y)에서 x는 행,
www.acmicpc.net
난이도
구현 / 난이도 ⭐️⭐️⭐️ / 1시간 40분
주의할점
1*2인 블럭이 떨어질 때, 블럭이 분리되지 않고 통째로 하나이다.
#include <stdio.h>
#include <vector>
#include <string>
using namespace std;
// 6 * 4
int answer;
int green[6][4];
int blue[6][4];
int N;
// red 4 * 4
void creak(int row, string type)
{
if (type == "green")
{
for (int i = row; i > 0; i--)
{
for (int j = 0; j < 4; j++)
{
green[i][j] = green[i - 1][j];
}
}
for (int j = 0; j < 4; j++)
{
green[0][j] = 0;
}
}
else if (type == "blue")
{
for (int i = row; i > 0; i--)
{
for (int j = 0; j < 4; j++)
{
blue[i][j] = blue[i - 1][j];
}
}
for (int j = 0; j < 4; j++)
{
blue[0][j] = 0;
}
}
// answer += 1; // check_point2 ) creak안에서 answer +=1 을 해줘서 답이 틀림
}
void get_over()
{
int move = 0;
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 4; j++)
{
if (green[i][j] == -1)
{
move += 1;
break;
}
}
}
for (int i = 0; i < move; i++)
{
creak(5, "green"); // check_point2 ) creak안에서 answer +=1 을 해줘서 답이 틀림
}
move = 0;
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 4; j++)
{
if (blue[i][j] == -1)
{
move += 1;
break;
}
}
}
for (int i = 0; i < move; i++)
{
creak(5, "blue");
}
}
void get_point()
{
for (int i = 5; i >= 0;)
{
bool check_green = true;
for (int j = 0; j < 4; j++)
{
if (green[i][j] != -1)
{
check_green = false;
}
}
if (check_green)
{
creak(i, "green");
answer += 1;
}
else
{
i--;
}
}
for (int i = 5; i >= 0;)
{
bool check_blue = true;
for (int j = 0; j < 4; j++)
{
if (blue[i][j] != -1)
{
check_blue = false;
}
}
if (check_blue)
{
creak(i, "blue");
answer += 1;
}
else
{
i--;
}
}
}
void fill(int y1, int y2, int height, string type)
{
vector<int> y;
y.push_back(y1);
y.push_back(y2);
int col;
int min_row;
if (type == "green")
{
min_row = 6;
for (int i = 0; i < y.size(); i++)
{
col = y[i];
if (col == -1)
continue;
for (int j = 0; j < 6; j++) // check point 1) 6부터 검사핬을때, 위에서부터 0 0 -1 -1 0 0 인 경우에 문제가 생김.;;
{
if (green[j][col] == -1)
{
if (j < min_row)
{
min_row = j;
}
break;
}
}
}
for (int i = 0; i < y.size(); i++)
{
col = y[i];
if (col == -1)
continue;
for (int j = 0; j < height; j++)
{
green[min_row - 1 - j][col] = -1;
}
}
}
else if (type == "blue")
{
min_row = 6;
for (int i = 0; i < y.size(); i++)
{
col = y[i];
if (col == -1)
continue;
for (int j = 0; j < 6; j++)
{
if (blue[j][col] == -1)
{
if (j < min_row)
{
min_row = j;
}
break;
}
}
}
for (int i = 0; i < y.size(); i++)
{
col = y[i];
if (col == -1)
continue;
for (int j = 0; j < height; j++)
{
blue[min_row - 1 - j][col] = -1;
}
}
}
get_point();
get_over();
}
void my_print(int arr[][4])
{
for (int i = 0; i < 6; i++)
{
for (int j = 0; j < 4; j++)
{
printf("%2d ", arr[i][j]);
}
printf("\n");
}
printf("\n");
}
int main()
{
answer = 0;
scanf("%d", &N);
int t, x, y;
for (int i = 0; i < N; i++)
{
scanf("%d %d %d", &t, &x, &y);
if (t == 1)
{
fill(y, -1, 1, "green");
fill(x, -1, 1, "blue");
}
else if (t == 2)
{
fill(y, y + 1, 1, "green");
fill(x, -1, 2, "blue");
}
else if (t == 3)
{
fill(y, -1, 2, "green");
fill(x, x + 1, 1, "blue");
}
}
int answer2 = 0;
for (int i = 0; i < 6; i++)
{
for (int j = 0; j < 4; j++)
{
if (green[i][j] == -1)
{
answer2 += 1;
}
if (blue[i][j] == -1)
{
answer2 += 1;
}
}
}
// printf("green\n");
// my_print(green);
// printf("blue\n");
// my_print(blue);
// printf("\n");
printf("%d\n", answer);
printf("%d", answer2);
}
'알고리즘 > [문제풀이] BOJ' 카테고리의 다른 글
[BOJ] 23290 - 마법사 상어와 복제 (0) | 2022.03.06 |
---|---|
[BOJ] 17825 - 주사위 윷놀이 (0) | 2021.10.22 |
[BOJ] 17142 - 연구소 3 (0) | 2021.10.22 |
[BOJ] 20058 - 마법사 상어와 파이어스톰 (0) | 2021.10.22 |
[BOJ] 17822 - 원판 돌리기 (0) | 2021.10.21 |