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

PythonでN個のクイーンソリューションを取得できるかどうかを確認するプログラム


0が空のセルを表し、1がそのセルのチェスの女王を表すバイナリ行列があるとします。このボードを埋めて、有効なnqueenソリューションを取得できるかどうかを確認する必要があります。私たちが知っているように、nクイーンのパズルは、2つのチェスクイーンが互いに攻撃できないように、n×nのチェス盤にnのクイーンを配置するように求めます。

したがって、入力が次のような場合

1 0 0 0 0
0 0 0 0 0
0 0 0 0 1
0 0 0 0 0
0 0 0 1 0

その場合、1つのソリューションは-

のようになるため、出力はTrueになります。
1 0 0 0 0
0 0 1 0 0
0 0 0 0 1
0 1 0 0 0
0 0 0 1 0

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

  • 関数isSafe()を定義します。これはボードを取ります、i、j

  • 0からボードのサイズまでの範囲のrについては、次のようにします

    • rがiと同じでなく、board [r、j]が1と同じである場合、

      • Falseを返す

  • r:=i + 1、c:=j + 1

  • r <ボードの行サイズ、c <ボードの列サイズ、do

    • board [r、c]が1と同じ場合、

      • Falseを返す

    • r:=r + 1、c:=c + 1

  • r:=i + 1、c:=j-1

  • r<ボードの行サイズおよびc>=0の場合、実行

    • board [r、c]が1と同じ場合、

      • Falseを返す

    • r:=r + 1、c:=c-1

  • r:=i-1、c:=j + 1

  • r> =0およびc<ボードの列サイズ、実行

    • board [r、c]が1と同じ場合、

      • Falseを返す

    • r:=r-1、c:=c + 1

  • r:=i-1、c:=j-1

  • r>=0およびc>=0の場合、実行

    • board [r、c]が1と同じ場合、

      • Falseを返す

    • r:=r-1、c:=c-1

  • Trueを返す

  • メインの方法から、次のようにします-

  • r:=0、c:=0

  • スタック:=新しいスタック

  • r <ボードの行サイズ、実行

    • 1がボード[r]にある場合、

      • r:=r + 1

      • 次のイテレーションに行く

    • それ以外の場合

      • 見つかった:=False

      • c <ボードの列サイズ、実行

        • isSafe(board、r、c)がtrueの場合、

          • ボード[r、c]:=1

          • [r、c]をスタックに挿入します

          • 見つかった:=True

          • ループから出てきます

        • c:=c + 1

      • 見つかった場合はtrue、

        • c:=0、r:=r + 1

      • それ以外の場合

        • スタックが空の場合、

          • Falseを返す

        • m:=スタックから最上位の要素を削除する

        • r:=m [0]、c:=m [1] + 1

        • ボード[r、c-1]:=0

  • Trueを返す

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

class Solution:
   def solve(self, board):
      def isSafe(board, i, j):
         for r in range(len(board)):
            if r != i and board[r][j] == 1:
               return False
         r, c = i + 1, j + 1
         while r < len(board) and c < len(board[0]):
            if board[r][c] == 1:
               return False
            r += 1
            c += 1
         r, c = i + 1, j - 1
         while r < len(board) and c >= 0:
            if board[r][c] == 1:
               return False
            r += 1
            c -= 1
         r, c = i - 1, j + 1
         while r >= 0 and c < len(board[0]):
            if board[r][c] == 1:
               return False
            r -= 1
            c += 1
         r, c = i - 1, j - 1
         while r >= 0 and c >= 0:
            if board[r][c] == 1:
               return False
            r -= 1
            c -= 1
         return True
      r = c = 0
      stack = []
      while r < len(board):
         if 1 in board[r]:
            r += 1
            continue
         else:
            found = False
            while c < len(board[0]):
               if isSafe(board, r, c):
                  board[r][c] = 1
                  stack.append([r, c])
                  found = True
                  break
               c += 1
            if found:
               c = 0
               r += 1
            else:
               if not stack:
                  return False
               m = stack.pop()
               r, c = m[0], m[1] + 1
               board[r][c - 1] = 0
      return True
ob = Solution()
matrix = [
   [1, 0, 0, 0, 0],
   [0, 0, 0, 0, 0],
   [0, 0, 0, 0, 1],
   [0, 0, 0, 0, 0],
   [0, 0, 0, 1, 0]
]
print(ob.solve(matrix))

入力

[ [1, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 1],
[0, 0, 0, 0, 0], [0, 0, 0, 1, 0] ]

出力

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()を定義します。これはソースを取ります