본문 바로가기
Programming/Algorithm

백준 12100 2048

by OKOK 2018. 4. 14.

1. 아이디어를 명확하게 구현하기.

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
/*
12100 2048 풀이
20:36
21:14
38분컷
설계 과정
1. 문제를 꼼꼼히 읽습니다.
2. 설계를 완벽하게 합니다. (예제 3개 돌리기)
3. 경우의 수를 나열합니다.
4. 초기화 변수를 확인합니다.
5. 가지치기를 합니다.
6. 예제와 동일한 변수 선언 및 사용합니다.
풀이 과정
1. 상하좌우에 대해서 dfs 를 돌립니다.
2. 통합함수를 구현합니다.
3. 가장 큰 숫자를 찾습니다.
- 합할때 queue 사용
*/
 
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
 
#define SIZE 22
int map[SIZE][SIZE];
int N;
queue<int> que;
int maxVal;
 
void problemIn() {
    cin >> N;
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            cin >> map[i][j];
        }
    }
}
 
void init() {
 
}
 
void copy_map(int(*a)[SIZE], int(*b)[SIZE]) {
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            b[i][j] = a[i][j];
        }
    }
}
/*
동 서 남 북
*/
 
void merge(int dir) {
    if (dir == 0) {
        for (int i = 0; i < N; i++) {
            for (int j = N-1; j >= 0; j--) {
                if (map[i][j] == 0continue;
                que.push(map[i][j]);
                map[i][j] = 0;
            }
            int idx = N - 1;
            int que_data;
 
            while(!que.empty()){
                que_data = que.front();
                que.pop();
 
                if (map[i][idx] == 0) { // 0 이면,
                    map[i][idx] = que_data;
                    continue;
                }
                else if (map[i][idx] == que_data) { // 같은 숫자를 만나면
                    map[i][idx] *= 2;
                    idx--;
                }
                else { // 다른 숫자를 만나면,
                    idx--;
                    map[i][idx] = que_data; 
                }
            }
        }
    }
 
    else if (dir == 1) {
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                if (map[i][j] == 0continue;
                que.push(map[i][j]);
                map[i][j] = 0;
            }
            int idx = 0;
            int que_data;
 
            while (!que.empty()) {
                que_data = que.front();
                que.pop();
 
                if (map[i][idx] == 0) { // 0 이면,
                    map[i][idx] = que_data;
                    continue;
                }
                else if (map[i][idx] == que_data) { // 같은 숫자를 만나면
                    map[i][idx] *= 2;
                    idx++;
                }
                else { // 다른 숫자를 만나면,
                    idx++;
                    map[i][idx] = que_data;
                }
            }
        }
    }
    else if (dir == 2) {
        for (int j = 0; j < N; j++) {
            for (int i = N - 1; i >= 0; i--) {
                if (map[i][j] == 0continue;
                que.push(map[i][j]);
                map[i][j] = 0;
            }
            int idx = N - 1;
            int que_data;
 
            while (!que.empty()) {
                que_data = que.front();
                que.pop();
 
                if (map[idx][j] == 0) { // 0 이면,
                    map[idx][j] = que_data;
                    continue;
                }
                else if (map[idx][j] == que_data) { // 같은 숫자를 만나면
                    map[idx][j] *= 2;
                    idx--;
                }
                else { // 다른 숫자를 만나면,
                    idx--;
                    map[idx][j] = que_data;
                }
            }
        }
    }
    else if (dir == 3) {
        for (int j = 0; j < N; j++) {
            for (int i = 0; i < N; i++) {
                if (map[i][j] == 0continue;
                que.push(map[i][j]);
                map[i][j] = 0;
            }
            int idx = 0;
            int que_data;
 
            while (!que.empty()) {
                que_data = que.front();
                que.pop();
 
                if (map[idx][j] == 0) { // 0 이면,
                    map[idx][j] = que_data;
                    continue;
                }
                else if (map[idx][j] == que_data) { // 같은 숫자를 만나면
                    map[idx][j] *= 2;
                    idx++;
                }
                else { // 다른 숫자를 만나면,
                    idx++;
                    map[idx][j] = que_data;
                }
            }
        }
    }
}
 
void dfs(int depth, int (*map)[SIZE]) {
 
    if (depth == 5) {
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                maxVal = max(maxVal, map[i][j]);
            }
        }
        return;
    }
 
    int map_store[SIZE][SIZE];
    copy_map(map, map_store);
 
    for (int i = 0; i < 4; i++) {
        merge(i);
        dfs(depth + 1, map);
        copy_map(map_store, map);
    }
}
 
void solve() {
    dfs(0, map);
}
 
int main() {
    problemIn();
    solve();
    cout << maxVal << endl;
    return 0;
}
cs