[アルゴリズム]2048(Easy)


標準的なサムスンのソフトウェアの能力は問題をテストします


2048(Easy)


白駿12100 2048(Easy)
これはシミュレーション2048ゲームで,最大5回移動したときに最大値を探索する問題である.ゲームの特性上、最大値を繰り返し下げることはありませんので、5つの場合の数だけ考えてください.このため,上下,左,右の4つの動作の繰返しを許容することを事前に考慮し,順序に従って5つを選択すれば透かし繰返し順で問題を解くことができる.
「上、下、左、右」をそれぞれ[0,1,2,3]とすると、[0,0,0]~[3,3,3,3,3,3]がチェックされ、最大値を持つブロックがフィルタされます.
場合によっては、itertoolsライブラリ内の重複シーケンスメソッドproductを使用して、メソッドをシミュレートする関数を実装する必要があります.シミュレーション関数は実装分野の問題であり,迅速に解決するためには経験値が必要である.解きほぐした后に说明する必要はありませんとても简単ですが...時間がかかりすぎた.

パスコード

from collections import deque
from copy import deepcopy
from itertools import product

size = int(input())
orgboard = []
for i in range(size):
   orgboard.append(list(map(int, input().split())))

def move(moveList):     #0123(상하좌우)에 따라 보드를 움직이고 가장 큰 수를 반환
   board = deepcopy(orgboard)
   for move in moveList:
       if move == 0:
           for i in range(size):
               temp = []
               for j in range(0, size):
                   if board[j][i]!=0:
                       temp.append(board[j][i])
                       board[j][i]=0
               for k in range(len(temp)-1):
                   if temp[k] == temp[k+1]:
                       temp[k] += temp[k+1]
                       temp[k+1] = 0
               index = 0
               for l in temp:
                   if l!=0:
                       board[index][i]=l
                       index+=1
       elif move == 1:
           for i in range(size):
               temp = []
               for j in range(size-1,-1,-1):
                   if board[j][i]!=0:
                       temp.append(board[j][i])
                       board[j][i]=0
               for k in range(len(temp)-1):
                   if temp[k] == temp[k+1]:
                       temp[k] += temp[k+1]
                       temp[k+1] = 0
               index = size-1
               for l in temp:
                   if l!=0:
                       board[index][i]=l
                       index-=1
       elif move == 2:
           for i in range(size):
               temp = []
               for j in range(0, size):
                   if board[i][j]!=0:
                       temp.append(board[i][j])
                       board[i][j]=0
               for k in range(len(temp)-1):
                   if temp[k] == temp[k+1]:
                       temp[k] += temp[k+1]
                       temp[k+1] = 0
               index = 0
               for l in temp:
                   if l!=0:
                       board[i][index]=l
                       index+=1
       else:
           for i in range(size):
               temp = []
               for j in range(size-1,-1,-1):
                   if board[i][j]!=0:
                       temp.append(board[i][j])
                       board[i][j]=0
               for k in range(len(temp)-1):
                   if temp[k] == temp[k+1]:
                       temp[k] += temp[k+1]
                       temp[k+1] = 0
               index = size-1
               for l in temp:
                   if l!=0:
                       board[i][index]=l
                       index-=1
   maxnum = 0
   for i in board:
       if maxnum < max(i):
           maxnum = max(i)

   return maxnum

case = list(product([0,1,2,3],repeat=5))   #0,1,2,3에서 5개 중복순열 추출한 경우의 수
answer = 0
answercase = 0
for i in case:
   temp = move(i)
   if temp>answer:
       answer = temp
       answercase = i

print(answer)