Game Develop

[Algorithm]Baekjoon 3019 :: 테트리스 본문

Algorithm/Baekjoon

[Algorithm]Baekjoon 3019 :: 테트리스

MaxLevel 2024. 1. 26. 21:52

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

 

3019번: 테트리스

테트리스는 C열 필드위에서 플레이하는 유명한 게임이다. 필드의 행의 수는 무한하다. 한 번 움직일 때, 아래와 같은 일곱가지 블록 중 하나를 필드에 떨어뜨릴 수 있다. 블록을 떨어뜨리기 전에

www.acmicpc.net

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
using namespace std;
 
 
int c, p;
int arr[101= { 0 };
vector<vector<vector<int>>> lookupTable =
{
    {},
    { {0}, {0,0,0,0} }, // 1번
    { {0,0} }, // 2번
    { {0,0,1}, {1,0}}, // 3번
    { {1,0,0}, {0,1}}, // 4번
    { {0,0,0}, {0,1}, {1,0,1}, {1,0}}, // 5번
    { {0,0,0}, {0,0}, {0,1,1}, {2,0}}, // 6번
    { {0,0,0}, {0,2}, {1,1,0}, {0,0}} // 7번
};
 
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
 
 
    cin >> c >> p;
    
    int answer = 0;
    for (int i = 0; i < c; ++i)
    {
        cin >> arr[i];
    }
 
    for (int i = 0; i < lookupTable[p].size(); ++i)
    {
        int blockWidth = lookupTable[p][i].size();
        
        if (blockWidth == 1)
        {
            answer += c;
            continue;
        }
 
        for (int j = 0; j <= c - blockWidth; ++j) // 각 열 검사.
        {
            int standardNum = arr[j] - lookupTable[p][i][0];
 
            for (int k = 1; k < blockWidth; ++k)
            {
                if (standardNum != arr[j + k] - lookupTable[p][i][k])
                {
                    standardNum = 0x3f3f3f3f;
                    break;
                }
            }
 
            if (standardNum != 0x3f3f3f3f)
            {
                ++answer;
            }
        }
    }
 
    cout << answer;
}
 
 
 
cs

 

특정 블럭을 끝까지 내렸을 때, 빈 칸 없이 딱 들어맞는 경우의 개수를 구하는 문제이다.

딱 들어맞는지의 여부는 각 도형모양일 때, 지면과 몇칸떨어져있는지를 미리 구한 후(룩업테이블에 저장), 전부 비교해서 같은값일 경우 정답카운팅을 하는식으로 풀면 된다.

 

기본적으로 완탐류를 많이 좋아하지않는게.. 속된말로 빡구현이 너무 귀찮다... 특히 테트리스류는 룩업테이블을 작성해놓는게 편한경우가 많기 때문에 어쩔수없이 하긴 해야한다.