Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

โปรแกรมค้นหาตำแหน่งกระดานถัดไปหลังจากเลื่อนทิศทางที่กำหนดหนึ่งครั้งใน Python


สมมติว่าเรามีกระดานเกม 2048 ที่เป็นตัวแทนของกระดานเริ่มต้นและทิศทางของสตริงที่แสดงถึงทิศทางการปัด เราต้องหาสถานะของกระดานถัดไป ดังที่เราทราบในเกม 2048 เราได้รับกระดานตัวเลข 4 x 4 (บางอันว่างเปล่า แสดงในที่นี้ด้วย 0) ซึ่งเราสามารถปัดไปในทิศทางใดก็ได้จาก 4 ทิศทาง ("U", "D" "L" หรือ "R") เมื่อเราปัด ตัวเลขทั้งหมดจะเคลื่อนที่ไปในทิศทางนั้นให้ไกลที่สุด และตัวเลขที่อยู่ติดกันที่เหมือนกันจะถูกรวมเข้าด้วยกันเพียงครั้งเดียว

ดังนั้นหากอินพุตเป็นแบบ

โปรแกรมค้นหาตำแหน่งกระดานถัดไปหลังจากเลื่อนทิศทางที่กำหนดหนึ่งครั้งใน Python

ทิศทาง ="L" จากนั้นผลลัพธ์จะเป็น

โปรแกรมค้นหาตำแหน่งกระดานถัดไปหลังจากเลื่อนทิศทางที่กำหนดหนึ่งครั้งใน Python

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้:

  • ถ้าทิศทางเหมือนกับ "R" แล้ว

    • กระดาน :=หมุนกระดานทวนเข็มนาฬิกาสองครั้ง

  • มิฉะนั้นเมื่อทิศทางเหมือนกับ "U" แล้ว

    • กระดาน :=หมุนกระดานทวนเข็มนาฬิกาหนึ่งครั้ง

  • มิฉะนั้นเมื่อทิศทางเหมือนกับ "D" แล้ว

    • กระดาน :=หมุนกระดานทวนเข็มนาฬิกาสามครั้ง

  • สำหรับผมอยู่ในช่วง 0 ถึง 3 ทำ

    • row :=รายการองค์ประกอบที่ไม่ใช่ศูนย์ทั้งหมดที่บอร์ด[i]

    • สำหรับ j ในช่วง 0 ถึง 2 ทำ

      • ถ้า j + 1 <ขนาดของแถวและแถว[j] เท่ากับแถว[j + 1] ดังนั้น

        • แถว[j] :=แถว[j] * 2

        • ลบแถว[j + 1]

    • ในขณะที่ขนาดของแถว <4 ทำ

      • ใส่ 0 ที่ท้ายแถว

    • กระดาน[i] :=แถว

  • ถ้าทิศทางเหมือนกับ "R" แล้ว

    • กระดาน :=หมุนกระดานทวนเข็มนาฬิกาสองครั้ง

  • มิฉะนั้นเมื่อทิศทางเหมือนกับ "U" แล้ว

    • กระดาน :=หมุนกระดานทวนเข็มนาฬิกาสามครั้ง

  • มิฉะนั้นเมื่อทิศทางเหมือนกับ "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"))

อินพุต

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

ผลลัพธ์

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