<C/C++> BOJ 12100 2048(Easy)

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

 

12100๋ฒˆ: 2048 (Easy)

์ฒซ์งธ ์ค„์— ๋ณด๋“œ์˜ ํฌ๊ธฐ N (1 ≤ N ≤ 20)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์—๋Š” ๊ฒŒ์ž„ํŒ์˜ ์ดˆ๊ธฐ ์ƒํƒœ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. 0์€ ๋นˆ ์นธ์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ์ด์™ธ์˜ ๊ฐ’์€ ๋ชจ๋‘ ๋ธ”๋ก์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๋ธ”๋ก์— ์“ฐ์—ฌ ์žˆ๋Š” ์ˆ˜๋Š” 2

www.acmicpc.net

 

#include <iostream>
using namespace std;

enum { UP, DOWN, LEFT, RIGHT };

struct board_t {
	int b[20][20];
};
int N;
int maxVal;

void moveTo(board_t& board, int dir) {
	for (int i = 0; i < N; i++) {
		bool isPossible = true;
		int target = dir == UP || dir == LEFT ? 0 : (N - 1);
		for (int j = 0; j < N; j++) {
			int varOffset = dir == UP || dir == LEFT ? j : (N - 1 - j);
			int& cur = dir == UP || dir == DOWN ? board.b[varOffset][i] : board.b[i][varOffset];

			if (cur != 0) {
				int& tPos = dir == UP || dir == DOWN ? board.b[target][i] : board.b[i][target];
				if (tPos == cur && isPossible) {
					if (target != varOffset) {
						isPossible = false;
						tPos *= 2;
						cur = 0;
					}
				}
				else {
					isPossible = true;
					if (tPos == 0) {
						tPos = cur;
						cur = 0;
					}
					else {
						target = target + (dir == UP || dir == LEFT ? 1 : -1);
						j--;
					}
				}
			}
		}
	}
}

void calcMax(board_t& board, int count) {
	if (count == 0) {
		for (int r = 0; r < N; r++) {
			for (int c = 0; c < N; c++) {
				if (board.b[r][c] > maxVal) maxVal = board.b[r][c];
			}
		}
		return;
	}

	board_t cpBoard;
	for (int dir = 0; dir < 4; dir++) {
		cpBoard = board;
		moveTo(cpBoard, dir);
		calcMax(cpBoard, count - 1);
	}
}

int main() {
	board_t board;

	cin >> N;
	for (int r = 0; r < N; ++r) {
		for (int c = 0; c < N; ++c) {
			cin >> board.b[r][c];
		}
	}

	calcMax(board, 5);
	cout << maxVal;
	return 0;
}