Lewis's Tech Keep
[백준] 2048 (easy) 본문
참고 : www.acmicpc.net/problem/12100
12100번: 2048 (Easy)
첫째 줄에 보드의 크기 N (1 ≤ N ≤ 20)이 주어진다. 둘째 줄부터 N개의 줄에는 게임판의 초기 상태가 주어진다. 0은 빈 칸을 나타내며, 이외의 값은 모두 블록을 나타낸다. 블록에 쓰여 있는 수는 2
www.acmicpc.net
- 시뮬레이션
- 구현 중점
- 1. 한쪽으로 이동 시킨다 (moveBlock)
- 2. 회전 시킨다 (좌 하 우 상 )
- 3. 5번 진행 시킨다.
더보기
코드 예제
import java.util.*;
public class Solution {
static int n;
static int[][] board1 = new int[22][22];
static int[][] board2 = new int[22][22];
private static void moveBlock(int dir) {
while(dir--> 0) rotate();
for (int i = 0; i < n; i++) {
int[] NBlock = new int[22];
int idx = 0;
for (int j = 0; j < n; j++) {
if(board2[i][j] == 0) continue;
if(NBlock[idx] == 0)
NBlock[idx] = board2[i][j];
else if(NBlock[idx] == board2[i][j])
NBlock[idx++] *= 2;
else
NBlock[++idx] = board2[i][j];
}
for (int j = 0; j < n; j++) {
board2[i][j] = NBlock[j];
}
}
}
private static void rotate() {
int[][] tmp = new int[22][22];
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];
}
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
board1[i][j] = sc.nextInt();
}
}
int mx = 0;
for (int tmp = 0; tmp < (1<<(2*5)); tmp++) {
for (int j = 0; j < n; j++) {
for (int k = 0; k < n; k++) {
board2[j][k] = board1[j][k];
}
}
int brute = tmp;
for (int i = 0; i < 5; i++) {
int dir = brute % 4;
brute /= 4;
moveBlock(dir);
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
mx = Math.max(mx, board2[i][j]);
}
}
}
System.out.println(mx);
}
}
'Java > 알고리즘' 카테고리의 다른 글
[백준] 타일 채우기 (0) | 2021.03.27 |
---|---|
[백준] 2xn 타일링 2 (0) | 2021.03.27 |
[백준] 2048(easy) - 실패 (0) | 2021.03.16 |
[백준] 스티커 붙이기 (0) | 2021.03.16 |
[백준] 감시 (0) | 2021.03.13 |
Comments