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

マトリックス内のいくつかの要素をチェックするプログラムは、Pythonでサイクルを形成するかどうか


2次元行列があるとします。あるセルから開始して、同じ値の隣接するセル(上、下、左、右)を移動し、同じ開始点に戻ることができるかどうかを確認する必要があります。最後に訪れたセルを再訪することはできません。

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

2
2
2
1
2
1
2
1
2
2
2
1

2秒後にサイクルを形成できるため、出力はTrueになります。

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

  • R:=行列の行数
  • C:=行列の列数
  • vis:=サイズR x Cの行列を作成し、Falseで埋めます
  • 関数dfs()を定義します。これが定着します
  • stack:=2つの要素がrootとnullのスタック
  • vis [root [0]、root [1]]:=True
  • スタックが空でない間は、
    • [v、prev]:=スタックの最上位要素、およびスタックからポップ
    • vの各ネイバーwについて、実行します
      • wがprevと同じでない場合、
        • vis [w [0]、w [1]]がfalseの場合、
          • vis [w [0]、w [1]]:=True
          • [w、v]をスタックにプッシュします
      • それ以外の場合、
        • Trueを返す
  • Falseを返す
  • メインの方法から次の手順を実行します。
  • 0からR-1の範囲のiの場合、do
    • 0からC-1の範囲のjの場合、do
      • vis [i、j]がfalseの場合、
        • dfs((i、j))がtrueの場合、
          • Trueを返す
  • Falseを返す

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

class Solution:
   def solve(self, matrix):
      R = len(matrix)
      C = len(matrix[0])

      def get_neighbors(i, j):
         val = matrix[i][j]
         for ii, jj in ((i + 1, j), (i - 1, j), (i, j + 1), (i, j - 1)):
            if 0 <= ii < R and 0 <= jj < C and matrix[ii][jj] == val:
               yield ii, jj

      vis = [[False] * C for _ in range(R)]

      def dfs(root):
         stack = [(root, None)]
         vis[root[0]][root[1]] = True
         while stack:
            v, prev = stack.pop()
            for w in get_neighbors(*v):
               if w != prev:
                  if not vis[w[0]][w[1]]:
                     vis[w[0]][w[1]] = True
                     stack.append((w, v))
                  else:
                     return True
         return False

      for i in range(R):
         for j in range(C):
            if not vis[i][j]:
               if dfs((i, j)):
                  return True
      return False
     
ob = Solution()
matrix = [
   [2, 2, 2, 1],
   [2, 1, 2, 1],
   [2, 2, 2, 1]
]
print(ob.solve(matrix))

入力

[  
[2, 2, 2, 1],  
[2, 1, 2, 1],  
[2, 2, 2, 1] ]

出力

True

  1. Pythonで奇数の長さのサイクルがグラフにあるかどうかを確認するプログラム

    無向グラフがあり、その中に奇数の長さのサイクルが見つかるかどうかを確認する必要があるとします。 したがって、入力がadj_list =[[1、2]、[0、3、4]、[0、3、4]、[1、2、4]、[1、2、3]] [0、1、3、4、2]、[1、3、4]、[2、3、4]のような奇数の長さのサイクルがあるため、出力はTrueになります。 これを解決するには、次の手順に従います- 関数dfs()を定義します。これはノードを取ります、私 ノードがパス内にある場合、 (i --path [node])が奇数の場合はtrueを返します ノードにアクセスした場合、 Falseを返す

  2. 指定された文字列がキーワードであるかどうかを確認するPythonプログラム

    この記事では、以下に示す問題ステートメントの解決策について学習します。 問題の説明 −数値が与えられているので、その数値が2の累乗であるかどうかを確認する必要があります。 キーワードは、特定の用途で任意の言語によって予約されている特別な単語であり、識別子として使用することはできません。 指定された文字列がキーワードであるかどうかを確認するために、以下で説明するようにキーワードモジュールを使用しました。 例 # keyword module import keyword # Function def isKeyword(word) :    # list of all