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

Pythonで開始点から終了点までコストkのパスの数をカウントするプログラム


2次元のバイナリ行列と別の値kがあるとします。左上のセルから始めて、右下のセルに移動する必要があります。一歩で、私たちは下がるか、右に下がることしかできません。これで、パスのスコアは、パス上のセルの値の合計になります。スコアkで開始セルから終了セルまでのパスの数を見つける必要があります。考えられる方法が非常に多い場合は、結果mod 10 ^ 9+7を返します。

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

0 0 1
1 0 1
0 1 0

K =2の場合、スコア2のパスは[R、R、D、D]、[D、R、R、D]、[D、D、R、R]、[D]であるため、出力は4になります。 、R、D、R]ここで、Dは下向きで、Rは右向きです。

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

  • deno:=10 ^ 9 + 7

  • m:=行列の行数、n:=行列の列数

  • 関数dfs()を定義します。これにはi、j、ptsが必要です

  • i>=mまたはj>=nの場合、

    • 0を返す

  • pts:=pts + matrix [i、j]

  • iがm-1と同じで、jがn-1と同じ場合、

    • ptsがkと同じ場合は1を返し、それ以外の場合は0を返します

  • dfs(i + 1、j、pts)+ dfs(i、j + 1、pts)を返す

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

  • dfs(0、0、0)mod deno

    を返します

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

class Solution:
   def solve(self, matrix, k):
      m, n = len(matrix), len(matrix[0])
      def dfs(i=0, j=0, pts=0):
         if i >= m or j >= n:
            return 0
         pts += matrix[i][j]
         if i == m - 1 and j == n - 1:
            return int(pts == k)
         return dfs(i + 1, j, pts) + dfs(i, j + 1, pts)
      return dfs() % (10 ** 9 + 7)

ob = Solution()
matrix = [
   [0, 0, 1],
   [1, 0, 1],
   [0, 1, 0]
]
k = 2
print(ob.solve(matrix, k))

入力

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

出力

4

  1. Pythonで特定のエッジを含む一意のパスの数をカウントするプログラム

    (u、v)の形式のエッジのリストがあり、これらがツリーを表しているとします。エッジごとに、入力で指定されたのと同じ順序で、そのエッジを含む一意のパスの総数を見つける必要があります。 したがって、入力がエッジのような場合=[[0、1]、[0、2]、[1、3]、[1、4]] その場合、出力は[6、4、4、4]になります。 これを解決するには、次の手順に従います- adj:=指定されたエッジからの隣接リスト count:=空のマップ 関数dfs()を定義します。これにはx、親が必要です count [x]:=1 adj [x]のnbごとに、実行 n

  2. Pythonで合計がkであるパスの数をカウントするプログラム

    二分木と別の値kがあるとすると、合計がkになるサブ子パスへの一意のノードの数を見つける必要があります。 したがって、入力が次のような場合 k =5の場合、パスは[2、3]と[1、4] であるため、出力は2になります。 これを解決するには、次の手順に従います- count:=マップは最初にキー0の値1を保持します ans:=0、プレフィックス:=0 関数dfs()を定義します。これはノードを取ります ノードがnullでない場合、 プレフィックス:=プレフィックス+ノードの値 ans:=ans +(count [prefix --target]、これが利用できない場合は0にな