백준 12100 : 2048 (심플) (파이썬)

Game 2048은 4×4 보드에서 혼자 플레이하는 재미있는 게임입니다.

이 문제에서 논의하는 2048 게임은 보드 크기가 N×N이다.
보드의 크기와 보드에 있는 블록의 상태를 고려하여 최대 2048까지 이동할 수 있는 가장 큰 블록의 값을 계산하는 프로그램을 작성하라. 5회 가능합니다.

기입

첫 번째 줄은 보드 크기 N(1 ≤ N ≤ 20)을 지정합니다.
게임 보드의 초기 상태는 두 번째 행부터 시작하여 N 행으로 제공됩니다.
0은 빈 셀을 나타내고 다른 모든 값은 블록을 나타냅니다.
블록에 적힌 숫자는 2보다 크거나 같고 1024보다 작거나 같은 2의 거듭제곱입니다.
최소 하나의 블록이 지정됩니다.

누르다

최대 5번 이동하여 얻을 수 있는 가장 큰 블록을 반환합니다.

2. 문제 해결

모든 경우를 4방향으로 재귀적으로 시도

세 가지 방식으로 어려움을 식별할 수 있습니다.

  1. 이동의 구현
  2. 모든 사례를 재귀적으로 검색
  3. 탐색하는 동안 새 목록 만들기

이를 신중하게 구현하여 코드를 완성했습니다.

from copy import deepcopy

def move(a, d, board):
    if d == 0:
        for i in range(a):
            cnt = 0
            for j in range(a - 1, -1, -1):
                if board(i)(j):
                    for jj in range(j + 1, a - cnt):
                        if board(i)(j) == board(i)(jj):
                            board(i)(j) = 0
                            board(i)(jj) *= 2
                            cnt += 1
                            break

                        elif board(i)(jj) and board(i)(j) !
= board(i)(jj): cnt += 1 save = board(i)(j) board(i)(j) = 0 board(i)(jj - 1) = save break elif jj == a - cnt - 1: save = board(i)(j) board(i)(j) = 0 board(i)(jj) = save elif d == 1: for i in range(a): cnt = 0 for j in range(a): if board(i)(j): for jj in range(j - 1, -1 + cnt, -1): if board(i)(j) == board(i)(jj): board(i)(j) = 0 board(i)(jj) *= 2 cnt += 1 break elif board(i)(jj) and board(i)(j) !
= board(i)(jj): cnt += 1 save = board(i)(j) board(i)(j) = 0 board(i)(jj + 1) = save break elif jj == cnt: save = board(i)(j) board(i)(j) = 0 board(i)(jj) = save elif d == 2: for i in range(a): cnt = 0 for j in range(a - 1, -1, -1): if board(j)(i): for jj in range(j + 1, a - cnt): if board(j)(i) == board(jj)(i): board(j)(i) = 0 board(jj)(i) *= 2 cnt += 1 break elif board(jj)(i) and board(j)(i) !
= board(jj)(i): cnt += 1 save = board(j)(i) board(j)(i) = 0 board(jj-1)(i) = save break elif jj == a - cnt - 1: save = board(j)(i) board(j)(i) = 0 board(jj)(i) = save elif d == 3: for i in range(a): cnt = 0 for j in range(a): if board(j)(i): for jj in range(j - 1, -1 + cnt, -1): if board(j)(i) == board(jj)(i): board(j)(i) = 0 board(jj)(i) *= 2 cnt += 1 break elif board(jj)(i) and board(j)(i) !
= board(jj)(i): cnt += 1 save = board(j)(i) board(j)(i) = 0 board(jj + 1)(i) = save break elif jj == cnt: save = board(j)(i) board(j)(i) = 0 board(jj)(i) = save def dfs(a, d, lst): global v lst1 = deepcopy(lst) move(n, d, lst1) if a == 5: for k in lst1: v = max(v, max(k)) return for k in range(4): dfs(a+1, k, lst1) n = int(input()) arr = (list(map(int, input().split())) for _ in range(n)) v = 0 for ii in range(4): arr1 = deepcopy(arr) dfs(1, ii, arr1) print(v)