728x90

www.acmicpc.net/problem/12100

 

12100번: 2048 (Easy)

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

www.acmicpc.net

BFS든 DFS든으로 풀 수 있다. 그런데 DFS로 푸는 것이 메모리를 더 절약할 수 있다.

한 쪽으로 미는 동작만 꼼꼼히 잘 구현하면 어려울 것은 없다. 

#include <iostream>
#include <vector>
#include <stack>
using namespace std;

int main() {
	cin.tie(NULL);
	ios::sync_with_stdio(false);
	int n;
	cin >> n;
	vector<vector<int>> v(n, vector<int>(n));
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			cin >> v[i][j];
		}
	}
	int maxNum = 0;
	stack<pair<vector<vector<int>>, int>> s;
	s.push(make_pair(v, 0));
	while (!s.empty()) {
		pair<vector<vector<int>>, int> cur = s.top();
		s.pop();
		vector<vector<int>> status = cur.first;
		int cnt = cur.second;
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				if (status[i][j] > maxNum) {
					maxNum = status[i][j];
				}
			}
		}
		if (cnt < 5) {
			// 위
			vector<vector<int>> temp1 = status;
			for (int j = 0; j < n; j++) {
				vector<int> temp;
				for (int i = 0; i < n; i++) {
					if (temp1[i][j] != 0) {
						temp.push_back(temp1[i][j]);
					}
				}
				int index = 0;
				while (true) {
					if (index >= temp.size())
						break;
					if (index + 1 < temp.size()) {
						if (temp[index] == temp[index + 1]) {
							temp[index] *= 2;
							temp.erase(temp.begin() + index + 1);
						}
					}
					index++;
				}
				for (int i = 0; i < temp.size(); i++) {
					temp1[i][j] = temp[i];
				}
				for (int i = temp.size(); i < n; i++) {
					temp1[i][j] = 0;
				}
			}
			s.push(make_pair(temp1, cnt + 1));
			// 왼쪽
			vector<vector<int>> temp2 = status;
			for (int i = 0; i < n; i++) {
				vector<int> temp;
				for (int j = 0; j < n; j++) {
					if (temp2[i][j] != 0) {
						temp.push_back(temp2[i][j]);
					}
				}
				int index = 0;
				while (true) {
					if (index >= temp.size())
						break;
					if (index + 1 < temp.size()) {
						if (temp[index] == temp[index + 1]) {
							temp[index] *= 2;
							temp.erase(temp.begin() + index + 1);
						}
					}
					index++;
				}
				for (int j = 0; j < temp.size(); j++) {
					temp2[i][j] = temp[j];
				}
				for (int j = temp.size(); j < n; j++) {
					temp2[i][j] = 0;
				}
			}
			s.push(make_pair(temp2, cnt + 1));
			// 아래
			vector<vector<int>> temp3 = status;
			for (int j = 0; j < n; j++) {
				vector<int> temp;
				for (int i = n - 1; i >= 0; i--) {
					if (temp3[i][j] != 0) {
						temp.push_back(temp3[i][j]);
					}
				}
				int index = 0;
				while (true) {
					if (index >= temp.size())
						break;
					if (index + 1 < temp.size()) {
						if (temp[index] == temp[index + 1]) {
							temp[index] *= 2;
							temp.erase(temp.begin() + index + 1);
						}
					}
					index++;
				}
				for (int i = 0; i < temp.size(); i++) {
					temp3[n - 1 - i][j] = temp[i];
				}
				for (int i = n - 1 - temp.size(); i >= 0; i--) {
					temp3[i][j] = 0;
				}
			}
			s.push(make_pair(temp3, cnt + 1));
			// 오른쪽
			vector<vector<int>> temp4 = status;
			for (int i = 0; i < n; i++) {
				vector<int> temp;
				for (int j = n - 1; j >= 0; j--) {
					if (temp4[i][j] != 0) {
						temp.push_back(temp4[i][j]);
					}
				}
				int index = 0;
				while (true) {
					if (index >= temp.size())
						break;
					if (index + 1 < temp.size()) {
						if (temp[index] == temp[index + 1]) {
							temp[index] *= 2;
							temp.erase(temp.begin() + index + 1);
						}
					}
					index++;
				}
				for (int j = 0; j < temp.size(); j++) {
					temp4[i][n - 1 - j] = temp[j];
				}
				for (int j = n - 1 - temp.size(); j >= 0; j--) {
					temp4[i][j] = 0;
				}
			}
			s.push(make_pair(temp4, cnt + 1));

		}
	}
	cout << maxNum;
	return 0;
}
728x90

'알고리즘 문제' 카테고리의 다른 글

[백준] 1339번 단어 수학  (0) 2021.01.18
[백준] 5014번 스타트링크  (0) 2021.01.18
[백준] 1915번 가장 큰 정사각형  (0) 2021.01.17
[백준] 14226번 이모티콘  (0) 2021.01.17
[백준] 1963번 소수 경로  (0) 2021.01.15

+ Recent posts