본문 바로가기

BOJ/C++

[BOJ] 12094. 2048(Hard)

*2048(easy)와 풀이단계는 비슷하지만, 가지치기를 해줘야 한다. (최대 횟수가 2배로 늘었기 때문에)

-가지치기

1) 변경된 맵이 변경되기 이전의 맵과 동일한 경우 -> 이 방향으로는 더 이상 나아가지 않는다. 

2) 맵에서 최대값을 찾을때, 최대값은 2승씩 커진다. (cnt==10 이라면 가장 최대값은 1024가 될 것이다. )

이 특징을 이용해서 현재 depth에서 최대값에 도달할 수 있는 지 확인한다.

(즉, 한 번 10번까지 변경된 맵에서 최대값을 추출한 후 maxBlock[10] = 1024 / maxBlock[9] = 512 .... 이런 식으로 미리 저장을 해 놓는다.)

*실제 최대값은 1024가 아닐 수 있다. 

3) 현재 맵에서 구한 최대값이 현재 depth(==cnt)에서 나와야 하는 최대값보다 작은 경우에는 더 이상 보지 않는다. 

 

*가지치기 1번 때문에 맵을 먼저 변경한 후에 dfs를 돌리도록 변경했다. 

쉬운 버전 참고

2019/08/01 - [BOJ/C++] - [BOJ] 12100. 2048(easy)

 

[BOJ] 12100. 2048(easy)

[문제] https://www.acmicpc.net/problem/12100 12100번: 2048 (Easy) 첫째 줄에 보드의 크기 N (1 ≤ N ≤ 20)이 주어진다. 둘째 줄부터 N개의 줄에는 게임판의 초기 상태가 주어진다. 0은 빈 칸을 나타내며,..

jayrightthere.tistory.com

 

 

'BOJ > C++' 카테고리의 다른 글

[BOJ] 2151. 거울설치 + TC  (0) 2020.03.18
[BOJ] 9376. 탈옥  (0) 2020.03.18
[BOJ] 16638. 괄호 추가하기2  (0) 2020.03.17
[BOJ] 16988. Baaaaaaaaaduk2 (Easy)  (0) 2020.03.16
[BOJ] 10711. 모래성  (0) 2020.03.15