반응형
https://www.codetree.ai/training-field/frequent-problems/problems/2048-game
2048 게임 문제 풀이는 BOJ 12100 : 2048 Easy와 같다.
#include <stdio.h>
#define MAX (20 + 5)
#define LEFT (0)
#define UP (1)
#define RIGHT (2)
#define DOWN (3)
int T;
int N;
int MAP[MAX][MAX];
int ANSWER;
void(*pMove[5])(int map[][MAX]);
void input()
{
scanf("%d", &N);
for (int r = 0; r < N; r++)
for (int c = 0; c < N; c++)
scanf("%d", &MAP[r][c]);
}
void output(int map[][MAX])
{
for (int i = 0; i < N; i++)
{
for (int k = 0; k < N; k++)
printf("%d ", map[i][k]);
putchar('\n');
}
}
int findMax(int map[][MAX])
{
int max = 0;
for (int r = 0; r < N; r++)
for (int c = 0; c < N; c++)
if (max < map[r][c]) max = map[r][c];
return max;
}
void initMap(int map[][MAX])
{
for (int r = 0; r < MAX; r++)
for (int c = 0; c < MAX; c++)
map[r][c] = 0;
}
void mapCopy(int dest[][MAX], int src[][MAX])
{
for (int r = 0; r < N; r++)
for (int c = 0; c < N; c++)
dest[r][c] = src[r][c];
}
void moveLeft(int map[][MAX])
{
int tmp[MAX][MAX] = { 0 };
initMap(tmp);
for (int r = 0; r < N; r++)
{
int step = 0;
for (int c = 0; c < N; c++)
{
if (map[r][c] == 0) continue;
tmp[r][step++] = map[r][c];
}
for (int c = 0; c < N - 1; c++)
{
if (tmp[r][c] != tmp[r][c + 1]) continue;
else
{
tmp[r][c] *= 2;
for (int cc = c + 1; cc < N - 1; cc++) tmp[r][cc] = tmp[r][cc + 1];
tmp[r][N - 1] = 0;
}
}
}
mapCopy(map, tmp);
}
void moveUp(int map[][MAX])
{
int tmp[MAX][MAX] = { 0 };
initMap(tmp);
for (int c = 0; c < N; c++)
{
int step = 0;
for (int r = 0; r < N; r++)
{
if (map[r][c] == 0) continue;
tmp[step++][c] = map[r][c];
}
for (int r = 0; r < N - 1; r++)
{
if (tmp[r][c] != tmp[r + 1][c]) continue;
else
{
tmp[r][c] *= 2;
for (int rr = r + 1; rr < N - 1; rr++) tmp[rr][c] = tmp[rr + 1][c];
tmp[N - 1][c] = 0;
}
}
}
mapCopy(map, tmp);
}
void moveRight(int map[][MAX])
{
int tmp[MAX][MAX] = { 0 };
initMap(tmp);
for (int r = 0; r < N; r++)
{
int step = N - 1;
for (int c = N - 1; c >= 0; c--)
{
if (map[r][c] == 0) continue;
tmp[r][step--] = map[r][c];
}
for (int c = N - 1; c >= 0; c--)
{
if (tmp[r][c] != tmp[r][c - 1]) continue;
else
{
tmp[r][c] *= 2;
for (int cc = c - 1; cc >= 0; cc--) tmp[r][cc] = tmp[r][cc - 1];
tmp[r][0] = 0;
}
}
}
mapCopy(map, tmp);
}
void moveDown(int map[][MAX])
{
int tmp[MAX][MAX] = { 0 };
initMap(tmp);
for (int c = 0; c < N; c++)
{
int step = N - 1;
for (int r = N - 1; r >= 0; r--)
{
if (map[r][c] == 0) continue;
tmp[step--][c] = map[r][c];
}
for (int r = N - 1; r >= 0; r--)
{
if (tmp[r][c] != tmp[r - 1][c]) continue;
else
{
tmp[r][c] *= 2;
for (int rr = r - 1; rr >= 0; rr--) tmp[rr][c] = tmp[rr - 1][c];
tmp[0][c] = 0;
}
}
}
mapCopy(map, tmp);
}
void DFS(int L, int map[][MAX])
{
if (L > 5)
{
int maxBlock = findMax(map);
if (ANSWER < maxBlock) ANSWER = maxBlock;
return;
}
int copy[MAX][MAX] = { 0 };
initMap(copy);
for (int i = 0; i < 4; i++)
{
mapCopy(copy, map);
pMove[i](copy);
DFS(L + 1, copy);
}
}
int main(void)
{
// scanf("%d", &T);
T = 1;
for (int tc = 1; tc <= T; tc++)
{
input();
ANSWER = 0;
pMove[LEFT] = moveLeft;
pMove[UP] = moveUp;
pMove[RIGHT] = moveRight;
pMove[DOWN] = moveDown;
DFS(1, MAP);
printf("%d\n", ANSWER);
}
return 0;
}
반응형
'알고리즘 > [ADV] 삼성 SW 역량 테스트 A형' 카테고리의 다른 글
[코드트리] 외주 수익 최대화하기 (삼성 SW 역량테스트 2017 상반기 오전 2번) (0) | 2024.06.06 |
---|---|
[코드트리] 테트리스 블럭 안의 합 최대화 하기 (삼성 SW 역량테스트 2017 상반기 오전 1번 문제) (0) | 2024.06.06 |
[코드트리] 정육면체 굴리기 (삼성 SW 역량테스트 2016 하반기 1번 문제) (1) | 2024.06.05 |
[코드트리] 2개의 사탕 (삼성 SW 역량테스트 2015 하반기 2번 문제) (1) | 2024.06.05 |
[코드트리] 바이러스 검사 (삼성 SW 역량테스트 2015 하반기 1번 문제) (1) | 2024.06.03 |
댓글