일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 3190
- 2798
- 13460
- 문제풀이
- 1259
- 백트래킹
- 13458
- 10872
- 15650
- 연산자 끼워넣기 성공
- 9663
- 14500
- 14503
- C
- 15683
- 러스트란 #cargo
- 14501
- 15651
- 분해합
- 15649
- 14888
- C++
- 팰린드롬수
- 14890
- 15652
- 테트로미노
- 백준
- rust설치
- 14891
- rustup
Archives
Easy-So-Easy
[백준] 12100번 2048 (Easy) - C/C++ 본문
반응형
백준 12100 문제(Problem)
풀이(Solution)
이 문제는 제목 그대로 easy 문제이다. 왜냐면 "5번까지 이동했을 때"라고 이동 횟수를 한정지어줬기 때문이다. 이 문제의 주의할 점은 다음과 같다.
** 한 번의 이동에서 이미 합쳐진 블록은 또 다른 블록과 다시 합쳐질 수 없다.**
이것을 계속 기억하면서 문제를 풀어나가자.
필자는 구현을 이용하여 문제를 풀었다. '상(1), 하(2), 좌(4), 우(3)'로 이동하는 케이스를 각각 코드 구현하였다. 코드는 아래에 확인하여 보기 바란다.
전체 코드(Code)
#include<iostream>
#include<algorithm>
using namespace std;
int n, max_e, last;
void check(int a[][21]) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
max_e = max(max_e, a[i][j]);
}
}
}
// 최대 5번 이동시켜서 얻을 수 있는 가장 큰 블록
void func(int depth, int map[21][21], int dir) {
if (depth == 5) {
check(map);
return;
}
int a[21][21];
for(int i=0; i<n; i++) {
for(int j=0; j<n; j++) {
a[i][j] = map[i][j];
}
}
// 위쪽으로 이동
if (dir == 1) {
for (int i = 0; i < n; i++) {
last = 0;
for (int j = 1; j < n; j++) {
int k = j;
while (k != last) {
if (a[k][i] == 0) break;
if (a[k - 1][i] == 0) {
a[k - 1][i] = a[k][i];
a[k][i] = 0;
}
else if (a[k][i] == a[k - 1][i]) {
a[k - 1][i] *= 2;
a[k][i] = 0;
last = k;
break;
}
else if (a[k][i] != a[k - 1][i]) {
break;
}
k--;
}
}
}
}
// 아래로 이동
if (dir == 2) {
for (int i = 0; i < n; i++) {
last = n - 1;
for (int j = n - 2; j >= 0; j--) {
int k = j;
while (k != last) {
if (a[k][i] == 0) break;
if (a[k + 1][i] == 0) {
a[k + 1][i] = a[k][i];
a[k][i] = 0;
}
else if (a[k][i] == a[k + 1][i]) {
a[k + 1][i] *= 2;
a[k][i] = 0;
last = k;
break;
}
else if (a[k][i] != a[k + 1][i]) {
break;
}
k++;
}
}
}
}
// 오른쪽으로 이동
if (dir == 3) {
for (int i = 0; i < n; i++) {
last = n - 1;
for (int j = n - 2; j >= 0; j--) {
int k = j;
while (k != last) {
if (a[i][k] == 0) break;
if (a[i][k + 1] == 0) {
a[i][k + 1] = a[i][k];
a[i][k] = 0;
}
else if (a[i][k] == a[i][k + 1]) {
a[i][k + 1] *= 2;
a[i][k] = 0;
last = k;
break;
}
else if (a[i][k] != a[i][k + 1]) {
break;
}
k++;
}
}
}
}
// 왼쪽으로 이동
if (dir == 4) {
for (int i = 0; i < n; i++) {
last = 0;
for (int j = 1; j < n; j++) {
int k = j;
while (k != last) {
if (a[i][k] == 0) break;
if (a[i][k - 1] == 0) {
a[i][k - 1] = a[i][k];
a[i][k] = 0;
}
else if (a[i][k] == a[i][k - 1]) {
a[i][k - 1] *= 2;
a[i][k] = 0;
last = k;
break;
}
else if (a[i][k] != a[i][k - 1]) {
break;
}
k--;
}
}
}
}
func(depth + 1, a, 1);
func(depth + 1, a, 2);
func(depth + 1, a, 3);
func(depth + 1, a, 4);
}
int main() {
int a[21][21];
cin >> n;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> a[i][j];
}
}
func(0, a, 1);
func(0, a, 2);
func(0, a, 3);
func(0, a, 4);
cout << max_e;
}
반응형
'BaekJoon' 카테고리의 다른 글
[백준] 13460번 구슬 탈출 2 - C/C++ (BFS) (0) | 2023.07.05 |
---|---|
[백준 3190] 뱀 - C/C++ <쉽게 설명> (0) | 2023.06.27 |
[백준] 14888번 연산자 끼워넣기 성공 - C/C++ (0) | 2023.06.24 |
[백준] 1259번 팰린드롬수 - C/C++ (0) | 2023.06.22 |
[백준] 10872번 팩토리얼 - C/C++ (0) | 2023.06.22 |