본문 바로가기

2048 (Easy) [12100] with 파이썬 본문

Algorithms/BFS and DFS

2048 (Easy) [12100] with 파이썬

Louisus 2020. 6. 4. 23:58
728x90

https://www.acmicpc.net/problem/12100

 

12100번: 2048 (Easy)

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

www.acmicpc.net

 

from copy import deepcopy

n =
int(input())
board = [
list(map(int, input().split())) for _ in range(n)]

# logic 생각
#
상하좌우 이동이 아닌 맵의 방향을 바꿔가면서 한방향으로만 보내는 방식으로 생각
# 90
회전

def rotate(b, n):
    nb = deepcopy(b)
   
for i in range(n):
       
for j in range(n):
            nb[j][n-i-
1] = b[i][j]
   
return nb

# 합쳐주기
def convert(lst, n):
    new_list = [i
for i in lst if i]

   
for i in range(1, len(new_list)):
       
# 합치기
       
if new_list[i-1] == new_list[i]:
            new_list[i-
1] *= 2
           
new_list[i] = 0
   
new_list = [i for i in new_list if i]
   
# 나머지 부분을 0으로 채워줌
   
return new_list + [0] * (n-len(new_list))

def dfs(n, b, cnt):
   
# 최대값
   
ret = max([max(i) for i in b])
   
# 횟수 사용 했을
   
if cnt == 0:
       
return ret

   
# 회전1 컨버트1 -> 4 방향
   
for _ in range(4):
       
# 합친 것을 반복하여 모든 행에 대해서 수행한 x 배열
       
x = [convert(i, n) for i in b]
       
# 기존의 모양과 다른 경우 -> 합치기 가능한 경우
       
if x != b:
           
# 기존의 배열과 같은 경우 나올때까지 dfs
           
ret = max(ret, dfs(n, x, cnt - 1))
       
# 기존의 배열과 같은 경우 회전 -> 더이상 합치기가 수행안될
       
b = rotate(b, n)
   
return ret

print(dfs(n,board,5))

'Algorithms > BFS and DFS' 카테고리의 다른 글

가장 먼 노드 with 파이썬  (0) 2020.08.06
배열 돌리기 4 [17406] with 파이썬  (0) 2020.06.05
Mooyo Mooyo [16768] with 파이썬  (0) 2020.06.04
과외맨 [5213] with 파이썬  (0) 2020.06.02
바이러스 [2606] with 파이썬  (0) 2020.06.02
Comments