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

Chương trình kiểm tra xem Amal có thể thắng trò chơi đá hay không bằng Python

Giả sử có hai người chơi Amal và Bimal, họ đang chơi một trò chơi và với Amal thì bắt đầu trước. Ban đầu, có n viên đá khác nhau trong một đống. Trên mỗi lượt của người chơi, anh ta thực hiện một động tác bao gồm loại bỏ bất kỳ số hình vuông (khác 0) của đá khỏi đống. Ngoài ra, nếu một người chơi không thể di chuyển, anh ta sẽ thua trò chơi. Vì vậy, nếu chúng ta có n, chúng ta phải kiểm tra xem Amal có thể thắng trò chơi hay không.

Vì vậy, nếu đầu vào là n =21, thì đầu ra sẽ là True vì lúc đầu Amal có thể lấy 16, sau đó Bimal lấy 4, sau đó Amal lấy 1 và thắng trò chơi.

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

  • Square:=một danh sách mới

  • hình vuông:=1

  • tăng:=3

  • trong khi hình vuông <=n, làm

    • chèn hình vuông vào cuối các hình vuông

    • vuông:=vuông + tăng

    • tăng:=tăng + 2

  • chèn hình vuông vào cuối các hình vuông

  • dp:=một danh sách trống có kích thước (n + 1)

  • dp [0]:=Sai

  • đối với k trong phạm vi từ 1 đến n, thực hiện

    • s:=0

    • dp [k]:=Sai

    • trong khi các ô vuông [s] <=k và dp [k] trống, hãy thực hiện

      • nếu dp [k - square [s]] trống, thì

        • dp [k]:=Đúng

      • s:=s + 1

  • trả về phần tử cuối cùng của dp

Ví dụ

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

def solve(n):
   squares = []
   square = 1
   increase = 3
   while square <= n:
      squares.append(square)
      square += increase
      increase += 2
   squares.append(square)

   dp = [None] * (n + 1)
   dp[0] = False
   for k in range(1, n + 1):
      s = 0
      dp[k] = False
      while squares[s] <= k and not dp[k]:
         if not dp[k - squares[s]]:
            dp[k] = True
         s += 1
   return dp[-1]

n = 21
print(solve(n))

Đầu vào

21

Đầu ra

True