DAMPER's 낙서장

12100 2048 (Easy) 본문

Problem Solving/BOJ 문제풀이

12100 2048 (Easy)

DAMPER 2021. 8. 18. 00:20
728x90

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

 

12100번: 2048 (Easy)

첫째 줄에 보드의 크기 N (1 ≤ N ≤ 20)이 주어진다. 둘째 줄부터 N개의 줄에는 게임판의 초기 상태가 주어진다. 0은 빈 칸을 나타내며, 이외의 값은 모두 블록을 나타낸다. 블록에 쓰여 있는 수는 2

www.acmicpc.net

 

온라인게임으로 했던 2048 게임을 구현하는 문제이다.

 

https://play2048.co/

 

2048

Join the numbers and get to the 2048 tile! Careful: this game is extremely addictive!

play2048.co

 

5번까지 움직여서 나오는 최대 숫자는 무언인지 출력하는 문제.

 

4방향을 움직여야하는데, 방향마다 움직이는 순서(우선순위)가 제각각이다보니 일반화하기가 까다로웠다.

예를 들어, 왼쪽으로 움직였을 때를 생각해보면

1. 모든 타일을 왼쪽으로 움직인다.

2. 맨 왼쪽부터 같은 숫자가 나오면 둘 중에 더 왼쪽에 있는 타일에 합쳐주고 다른 타일은 0으로 만든다.

3. 합쳐져서 0이된 칸을 없애기 위해 다시 모든 타일을 왼쪽으로 움직인다.

 

2번과정을 보면 맨 왼쪽부터 타일을 합쳐주는 작업을 한다. 오른쪽으로 움직였을 때는 오른쪽부터, 위쪽으로 움직였을 때는 위쪽부터 움직여줘야한다.

결국 일반화하지 않고 모든 방향에 대해서 함수를 만들었다.

 

 

 

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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
#include <bits/stdc++.h>
 
using namespace std;
 
#define swap(a,b) (a)^=(b)^=(a)^=(b)
#define endl '\n'
#define int long long
 
using pii = pair<intint>;
 
const double EPS = 1e-9;
const int dx[] = {1-100};
const int dy[] = {001-1};
 
int mx, n;
 
void addLeft(vector<vector<int>>& v);
void addRight(vector<vector<int>>& v);
void addUp(vector<vector<int>>& v);
void addDown(vector<vector<int>>& v);
 
void moveLeft(vector<vector<int>>& v);
void moveRight(vector<vector<int>>& v);
void moveUp(vector<vector<int>>& v);
void moveDown(vector<vector<int>>& v);
 
void LEFT(vector<vector<int>>& v);
void RIGHT(vector<vector<int>>& v);
void UP(vector<vector<int>>& v);
void DOWN(vector<vector<int>>& v);
 
 
void recursive(int pos, vector<vector<int>> v)
{
    for(size_t i=0;i<v.size();i++)
            for(size_t j=0;j<v[i].size();j++)
                mx = max(v[i][j], mx);
    if(pos == 5return;
    vector<vector<int>> left(v), right(v), up(v), down(v);
    LEFT(left);
    recursive(pos+1, left);
    RIGHT(right);
    recursive(pos+1, right);
    UP(up);
    recursive(pos+1, up);
    DOWN(down);
    recursive(pos+1, down);
 
}
 
int32_t main()
{
    cin.sync_with_stdio(NULL);
    cin.tie(NULL);
    cout.tie(NULL);
 
    cin >> n;
    vector<vector<int>> initial(n, vector<int>(n, 0));
    for(int i=0;i<n;i++
        for(int j=0;j<n;j++)
            cin >> initial[i][j];
 
    recursive(0, initial);
    
    cout << mx;
 
    return 0;
}
 
void addLeft(vector<vector<int>>& v)
{
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n-1;j++)
        {
            if(v[i][j] == v[i][j+1])
            {
                v[i][j] += v[i][j+1];
                v[i][j+1= 0;
            }
        }
    }
}
 
void addRight(vector<vector<int>>& v)
{
    for(int i=0;i<n;i++)
    {
        for(int j=n-1;j>0;j--)
        {
            if(v[i][j] == v[i][j-1])
            {
                v[i][j] += v[i][j-1];
                v[i][j-1= 0;
            }
        }
    }
}
 
void addUp(vector<vector<int>>& v)
{
    for(int i=0;i<n-1;i++)
    {
        for(int j=0;j<n;j++)
        {
            if(v[i][j] == v[i+1][j])
            {
                v[i][j] += v[i+1][j];
                v[i+1][j] = 0;
            }
        }
    }
}
 
void addDown(vector<vector<int>>& v)
{
    for(int i=n-1;i>0;i--)
    {
        for(int j=0;j<n;j++)
        {
            if(v[i][j] == v[i-1][j])
            {
                v[i][j] += v[i-1][j];
                v[i-1][j] = 0;
            }
        }
    }
}
void moveLeft(vector<vector<int>>& v)
{
    for(size_t i=0;i<v.size();i++)
    {
        for(size_t j=0;j<v[i].size();j++)
        {
            int y = i, x = j;
            if(v[y][x])
            {
                while( x>0 && v[y][x-1== 0) x--;
                if(y == i && x == j) continue;
                v[y][x] = v[i][j];
                v[i][j] = 0;
            }
        }
    }
}
 
void moveRight(vector<vector<int>>& v)
{
    for(int i=0;i<n;i++)
    {
        for(int j=n-1;j>=0;j--)
        {
            int y = i, x = j;
            if(v[y][x])
            {
                while( x < n-1 && v[y][x+1== 0) x++;
                if(y == i && x == j) continue;
                v[y][x] = v[i][j];
                v[i][j] = 0;
            }
        }
    }
}
 
void moveUp(vector<vector<int>>& v)
{
    for(size_t i=0;i<v.size();i++)
    {
        for(size_t j=0;j<v[i].size();j++)
        {
            int y = i, x = j;
            if(v[y][x])
            {
                while( y>0 && v[y-1][x] == 0) y--;
                if(y == i && x == j) continue;
                v[y][x] = v[i][j];
                v[i][j] = 0;
            }
        }
    }
}
 
void moveDown(vector<vector<int>>& v)
{
    for(int i=n-1;i>=0;i--)
    {
        for(size_t j=0;j<v[i].size();j++)
        {
            int y = i, x = j;
            if(v[y][x])
            {
                while( y < n-1 && v[y+1][x] == 0) y++;
                if(y == i && x == j) continue;
                v[y][x] = v[i][j];
                v[i][j] = 0;
            }
        }
    }
}
 
void LEFT(vector<vector<int>>& v)
{
    moveLeft(v);
    addLeft(v);
    moveLeft(v);
}
 
void RIGHT(vector<vector<int>>& v)
{
    moveRight(v);
    addRight(v);
    moveRight(v);
}
 
void UP(vector<vector<int>>& v)
{
    moveUp(v);
    addUp(v);
    moveUp(v);
}
 
void DOWN(vector<vector<int>>& v)
{
    moveDown(v);
    addDown(v);
    moveDown(v);
}
cs

 

728x90

'Problem Solving > BOJ 문제풀이' 카테고리의 다른 글

1208 부분수열의 합 2  (0) 2021.08.20
9252 LCS 2  (0) 2021.08.20
9328 열쇠  (0) 2021.08.17
2473 세 용액  (0) 2021.08.17
9466 텀 프로젝트  (0) 2021.05.14