하다보니
12100번-2048(Easy) 본문
/*
2048 문제
- 게임판을 상하좌우로 기울인다. 5번 기울여서 최대값을 고른다. -> 모든 경우의 수를 다 확인.
- 게임판을 기울이면 숫자가 기울면서 합쳐진다. -> 상하좌우는 게임판을 돌려서 구현하고, 기울여서 합쳐지는 함수
*/
#include<iostream>
#include<algorithm>
using namespace std;
int n; //한변의 길이
int board1[25][25]; //입력받는 원본 게임판
int board2[25][25]; //복사하여 최대값을 구하려는 것
void rotate() {
int tmp[25][25];
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
tmp[i][j] = board2[i][j];
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
board2[i][j] = tmp[n - 1 - j][i];
}
void tilt(int dir) {
while (dir--)rotate();
for (int i = 0; i < n; i++) {
int tilted[25] = {};
int idx = 0;
for (int j = 0; j < n; j++) {
if (board2[i][j] == 0)continue;
if (tilted[idx] == 0) {
tilted[idx] = board2[i][j];
}
else if (tilted[idx] == board2[i][j]) {
tilted[idx++] *= 2;
}
else {
tilted[++idx] = board2[i][j];
}
}
for (int j = 0; j < n; j++)board2[i][j] = tilted[j];
}
}
int main() {
cin >> n;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> board1[i][j];
}
}
//5번 돌릴때마다 4가지 경우의 수
int mx = 0;
for (int tmp = 0; tmp < 1024; tmp++) {
//매 경우마다 새로운 board2를 복사해서 사용
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
board2[i][j] = board1[i][j];
int brute = tmp;
//5번의 각각 해당하는 값. 4진법 사용하여 0000~3333까지
for (int i = 0; i < 5; i++) {
int dir = brute % 4;
brute /= 4;
tilt(dir);
}
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
mx = max(mx, board2[i][j]);
}
cout << mx;
}
'알고리즘 풀이 > 백준' 카테고리의 다른 글
14888번-연산자 끼워넣기 (0) | 2022.04.05 |
---|---|
14502번-연구소 (0) | 2022.03.30 |
20055번-컨베이어 벨트 위의 로봇 (0) | 2022.03.27 |
2206번-벽 부수고 이동하기 (0) | 2022.03.17 |
2579번-계단 오르기 (0) | 2022.03.12 |