Algorithm/백준

[백준][12100번] 2048 (Easy)

1일1코딩 2020. 4. 16. 22:02

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

 

12100번: 2048 (Easy)

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

www.acmicpc.net

풀이과정

1. 완전탐색으로 풀었다.

2. 동,서,남,북 방향으로 맵을 이동시켰다. 

 

결과

 

소스코드

더보기
#include<stdio.h>
#include<string.h>
enum DIRECTION {
	EAST, WEST, SOUTH, NORTH
};
int map[20][20];
int N;
int answer = 0;
void moveMap(int dir)
{
	if (dir == EAST || dir == SOUTH) {
		for (int i = 0; i < N; i++) {
			int prev = 0;
			int idx = N - 1;
			for (int j = N - 1; j >= 0; j--) {
				int cur = (dir == EAST) ? map[i][j] : map[j][i];
				if (cur == 0) continue;
				if (prev == cur) {
					if (dir == EAST) {
						map[i][idx + 1] *= 2;
						map[i][j] = 0;
						prev = 0;
					}
					else {
						map[idx + 1][i] *= 2;
						map[j][i] = 0;
						prev = 0;
					}
				}
				else {
					prev = cur;
					if (dir == EAST) {
						map[i][j] = 0;
						map[i][idx] = cur;
					}
					else {
						map[j][i] = 0;
						map[idx][i] = cur;
					}
					idx--;
				}
			}
		}
	}
	else {
		for (int i = 0; i < N; i++) {
			int prev = 0;
			int idx = 0;
			for (int j = 0; j < N; j++) {
				int cur = (dir == WEST) ? map[i][j] : map[j][i];
				if (cur == 0) continue;
				if (prev == cur) {
					if (dir == WEST) {
						map[i][idx - 1] *= 2;
						map[i][j] = 0;
						prev = 0;
					}
					else {
						map[idx - 1][i] *= 2;
						map[j][i] = 0;
						prev = 0;
					}
				}
				else {
					prev = cur;
					if (dir == WEST) {
						map[i][j] = 0;
						map[i][idx] = cur;
					}
					else {
						map[j][i] = 0;
						map[idx][i] = cur;
					}
					idx++;
				}
			}
		}
	}
}

void solution(int count)
{
	if (count >= 5) {
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
				if (map[i][j] > answer) {
					answer = map[i][j];
				}
			}
		}
		return;
	}
	int cpymap[20][20] = { 0, };
	memcpy(cpymap, map, sizeof(map));
	for (int i = 0; i < 4; i++) {
		moveMap(i);
		solution(count + 1);
		memcpy(map, cpymap, sizeof(map));
	}
}

int main()
{
	scanf("%d", &N);
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < N; j++) {
			scanf("%d", &map[i][j]);
		}
	}
	solution(0);
	printf("%d\n", answer);
}