티스토리 뷰

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);
}

 

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
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 31
글 보관함