362 words
2 minutes
[BOJ] 2048(Easy)
TimeLimit | MemoryLimit | Condition | TAG |
---|---|---|---|
1s | 256MB | (1≤ N ≤ 20) | Implementation |
문제는 굉장히 재미있게 풀었습니다. 뭐 깊이 생각할게 없었던 것이 좀 아쉬웠지만, 그래도 게임을 구현하는 느낌으로 재미있게 풀었던 것 같습니다.
저는 단순히 보드를 회전시키면서 한 방향으로 밀어버리기를 선택해서 풀었습니다.
뭐 구현은 간단하기 때문에 딱히 설명은 필요없을 것 같네요.
정답 코드
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int n;
vector<vector<int>> rotate(vector<vector<int>>& board){
vector<vector<int>> current(n, vector<int>(n));
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
current[j][n-1-i] = board[i][j];
}
}
return current;
}
vector<vector<int>> play(vector<vector<int>>& board){
vector<vector<int>> current(n, vector<int>(n, 0));
// 일단 다 당겨보자 한번에 해봐? 근데 위로 올리는거임
for(int i = 0; i < n; i++){ // x
int currentPos = 0; // current에 대한 현재 위치값.
current[0][i] = board[0][i];
for(int j = 1; j < n; j++){ // y
int currentCost = current[currentPos][i];
if(board[j][i] != 0){
if(currentCost == 0) current[currentPos][i] = board[j][i];
else{
if(currentCost == board[j][i]) current[currentPos][i]*=2;
else current[currentPos+1][i] = board[j][i];
currentPos++;
}
}
}
}
return current;
}
int solution(vector<vector<int>>& board, int depth){
int result = 0;
for(int i = 0; i < n*n; i++) result = max(result, board[i/n][i%n]);
if(depth > 5) return result;
vector<vector<int>> origin = board;
for(int i = 0; i < 4; i++){
board= play(origin);
if(board != origin)
result = max(result, solution(board, depth+1));
origin = rotate(origin);
}
return result;
}
int main() {
cin >> n;
vector<vector<int>> board(n, vector<int>(n));
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) cin >> board[i][j];
}
cout << solution(board, 1);
return 0;
}
[BOJ] 2048(Easy)
https://compy07.github.io/Blog/posts/boj/12100/