Computer >> Máy Tính >  >> Lập trình >> Python

Chương trình tìm vị trí bảng tiếp theo sau khi trượt theo hướng đã cho một lần bằng Python

Giả sử chúng ta có một bảng trò chơi 2048 đại diện cho bảng ban đầu và một hướng chuỗi biểu thị hướng vuốt, chúng ta phải tìm trạng thái bảng tiếp theo. Như chúng ta đã biết trong trò chơi 2048, chúng ta được cung cấp một bảng số 4 x 4 (một số trong số đó trống, được biểu thị ở đây bằng 0) mà chúng ta có thể vuốt theo bất kỳ hướng nào trong số 4 hướng ("U", "D", "L" hoặc "R"). Khi chúng tôi vuốt, tất cả các số di chuyển theo hướng đó càng xa càng tốt và các số liền kề giống hệt nhau được cộng lại chính xác một lần.

Vì vậy, nếu đầu vào giống như

Chương trình tìm vị trí bảng tiếp theo sau khi trượt theo hướng đã cho một lần bằng Python

hướng ="L", thì đầu ra sẽ là

Chương trình tìm vị trí bảng tiếp theo sau khi trượt theo hướng đã cho một lần bằng Python

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau:

  • nếu hướng giống như "R" thì

    • board:=xoay board ngược chiều kim đồng hồ hai lần

  • ngược lại khi hướng giống như "U" thì

    • board:=xoay board ngược chiều kim đồng hồ một lần

  • ngược lại khi hướng giống như "D" thì

    • board:=xoay board ngược chiều kim đồng hồ ba lần

  • đối với tôi trong phạm vi từ 0 đến 3, hãy thực hiện

    • row:=danh sách tất cả các phần tử khác 0 trên bảng [i]

    • đối với j trong phạm vi 0 đến 2, thực hiện

      • nếu j + 1

        • row [j]:=row [j] * 2

        • xóa hàng [j + 1]

    • trong khi kích thước của hàng <4, thực hiện

      • chèn 0 vào cuối hàng

    • bảng [i]:=hàng

  • nếu hướng giống như "R" thì

    • board:=xoay board ngược chiều kim đồng hồ hai lần

  • ngược lại khi hướng giống như "U" thì

    • board:=xoay board ngược chiều kim đồng hồ ba lần

  • ngược lại khi hướng giống như "D" thì

    • board:=xoay board ngược chiều kim đồng hồ một lần

  • bảng trả lại

Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn

Ví dụ

class Solution:
   def solve(self, board, direction):
      if direction == "R":
         board = rot_anti_clock_dir(rot_anti_clock_dir(board))
      elif direction == "U":
         board = rot_anti_clock_dir(board)
      elif direction == "D":
         board = rot_anti_clock_dir(rot_anti_clock_dir(rot_anti_clock_dir(board)))

      for i in range(4):
         row = [x for x in board[i] if x]
         for j in range(3):
            if j + 1 < len(row) and row[j] == row[j + 1]:
               row[j] *= 2
               del row[j + 1]
            while len(row) < 4:
               row += [0]
            board[i] = row

      if direction == "R":
         board = rot_anti_clock_dir(rot_anti_clock_dir(board))
      elif direction == "U":
         board = rot_anti_clock_dir(rot_anti_clock_dir(rot_anti_clock_dir(board)))
      elif direction == "D":
         board = rot_anti_clock_dir(board)
      return board


def rot_anti_clock_dir(x):
   x = [[x[i][j] for i in range(4)] for j in range(4)]
   return x[::-1]

ob = Solution()
matrix = [
[2, 0, 0, 2],
[2, 2, 2, 2],
[0, 4, 2, 2],
[2, 2, 2, 0]]
print(ob.solve(matrix, "L"))

Đầu vào

matrix = [
[2, 0, 0, 2],
[2, 2, 2, 2],
[0, 4, 2, 2],
[2, 2, 2, 0]]

Đầu ra

[
[4, 0, 0, 0],
[4, 4, 0, 0],
[4, 4, 0, 0],
[4, 2, 0, 0]]