Python
 Computer >> コンピューター >  >> プログラミング >> Python

AmalがPythonでストーンゲームに勝つことができるかどうかをチェックするプログラム


AmalとBimalの2人のプレーヤーがいて、彼らがゲームをプレイしていて、Amalが最初に開始するとします。最初は、山の中にn個の異なる石があります。各プレイヤーのターンで、彼は山から任意の平方数(ゼロ以外)の石を取り除くことからなる動きをします。また、1人のプレーヤーが移動できない場合、そのプレーヤーはゲームに負けます。したがって、nがある場合、Amalがゲームに勝つことができるかどうかを確認する必要があります。

したがって、入力がn =21の場合、出力はTrueになります。これは、最初にAmalが16を取り、次にBimalが4を取り、次にAmalが1を取り、ゲームに勝つためです。

これを解決するには、次の手順に従います-

  • 四角:=新しいリスト

  • 正方形:=1

  • 増加:=3

  • 正方形<=n、実行

    • 正方形の端に正方形を挿入します

    • 正方形:=正方形+増加

    • 増加:=増加+ 2

  • 正方形の端に正方形を挿入します

  • dp:=サイズの空白リスト(n + 1)

  • dp [0]:=False

  • 1からnの範囲のkについては、次のようにします

    • s:=0

    • dp [k]:=False

    • squares [s] <=kおよびdp[k]が空の場合、実行

      • dp [k --squares [s]]が空の場合、

        • dp [k]:=True

      • s:=s + 1

  • dpの最後の要素を返す

理解を深めるために、次の実装を見てみましょう

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))

入力

21

出力

True

  1. Pythonでノードを交換することで2つのツリーを形成できるかどうかを確認するプログラム

    2つのツリーがあるとすると、ノードの左右のサブツリーを何度でも交換して、最初のツリーを2番目のツリーに変換できるかどうかを確認する必要があります。 したがって、入力が次のような場合 その場合、出力はTrueになります これを解決するには、次の手順に従います- que1:=最初はroot0のキュー que2:=最初はroot1のキュー que1とque2は空ではありませんが、実行してください temp1:=新しいリスト、temp2:=新しいリスト values1:=新しいリスト、values2:=新しいリスト que1とque2に含まれる要素の数が

  2. 与えられたグラフがPythonで2部グラフであるかどうかをチェックするプログラム

    無向グラフが1つあるとすると、グラフが2部グラフであるかどうかを確認する必要があります。グラフのすべてのエッジ{u、v}がAに1つのノードuを持ち、Bに別のノードvを持つように、グラフのノードを2つのセットAとBに分割できる場合、グラフは2部グラフであることがわかります。 したがって、入力が次のような場合 次に、出力はTrueになり、[0,4]はセットAにあり、[1,2,3]はセットBにあり、すべてのエッジはAからAまたはBからBではなく、AからBまたはBからAになります。 。 これを解決するために、次の手順に従います- 関数dfs()を定義します。これはソースを取ります