証明安全offer0515:1、パス行列2、ロボットの移動範囲

図1に示すように、パス行列

タイトル説明は、
マトリックス内の文字列のすべての文字を含むルートがあるかどうかを決定する機能を設計してください。格子パスはマトリックスのいずれかから開始することができる、行列の各ステップは、1つのグリッド上下、左右することができます。1つのグリッドの行列による1つのパスした場合、次のように再びグリッドを入力することはできません。そのようなabcesfcsadee例えば3×4マトリクスの文字列に「bcced」パスを含むが、最初の文字列が第二格子状に行列Bの最初の行を占有するので、行列「ABCB」パスが含まれていませんその後、パスが再びグリッドを入力することはできません。

注意:パースを見て、コードレビューのセクションのコメント-
リンク:https://www.nowcoder.com/questionTerminal/c61c6999eecb4b8f88a98f66b273a3cc
出典:牛オフネットワークを

分析:バックトラック
これは、一般的な遡及法で解ける問題です。まず、マトリックス中の出発点として任意に格子経路。i番目の文字がパスCH上にない場合、グリッドは、パス上のi番目の位置には不可能です。i番目の文字がパスCH上にあることを起こる場合は、パス上のI + 1文字に隣接する第1グリッドを探します。マトリクス・グリッド上の境界に加えて、グリッドは、他の4つの隣接する格子を有します。すべての文字がマトリックスに対応する位置を見つけるために、パス上にあるまで、このプロセスを繰り返します。
  なぜなら、再帰的性質レトロスペクティブ方法、経路スタックに開いていてもよいです。N-1のパスに限り、最初に戻って、今回のn + 1つの文字を見つけていないグリッドに対応する最初のn文字の周りに、行列の最初のn文字の位置の経路内に配置されたとき文字、再配置するn個の文字。
  パスのでエントリ細胞マトリックス、及び経路は、各グリッドに入ったかどうかを識別するために、マトリックスのブール行列サイズとして文字を定義する必要は繰り返しません。ときに隣接する4つの格子(行、COL-1)から格子マトリックスと同じ対応する文字のパス文字列の座標(行、列)、 (行1、COL)、(行、列+1)および(行+ 1、COL)次の文字列を検索するパスにおける
4つの隣接するグリッドが次の文字列と一致しない場合、文字列は、行列における電流経路を示し位置が正しくない、我々はその後、元に戻す再配置する必要があります。
  すべての文字がマトリックス中の適切な位置を見つけるために、パス文字列になるまで、このプロセスが繰り返されます

# -*- coding:utf-8 -*-
class Solution:
    def hasPath(self, matrix, rows, cols, path):
        # write code here
        for i in range(rows):
            for j in range(cols):
                if matrix[i*cols + j] == path[0]:
                    if self.find(list(matrix),rows,cols,path[1:],i,j):
                        return True
        return False
    def find(self,matrix,rows,cols,path,i,j):
        if not path:
            return True
        matrix[i*cols + j] = '0'
        if j+1 < cols and matrix[i*cols+j+1] == path[0]:
            return self.find(matrix,rows,cols,path[1:],i ,j+1)
        elif j-1 >= 0 and matrix[i*cols+j-1] == path[0]:
            return self.find(matrix,rows,cols,path[1:],i ,j-1)
        elif i+1 < rows and matrix[(i+1)*cols + j] == path[0]:
            return self.find(matrix,rows,cols,path[1:],i+1,j)
        elif i-1 >= 0 and matrix[(i-1)*cols + j] == path[0]:
            return self.find(matrix,rows,cols,path[1:],i-1,j)
        else:
            return False

図2に示すように、ロボットの運動範囲

タイトル説明は
m行n列のグリッドが存在するグランド。グリッドからロボットが移動、右、左だけ毎回0,0座標上下四方セルが、グリッドの行および列の座標を入力することができないビットkの数の合計よりも大きいです。kが18である場合、例えば、ロボットが3 + 3 + 5 + 7 = 18から、ボックス(35、37)を入力することができます。3 + 3 + 5 + 8 = 19しかし、それは、ボックス(35、38)を入力することができません。ロボットは、格子の数に到達することができるだろうか?
分析:
思考:DFSは、4つの方向、VIS市松模様が検索されているかどうかのレコードを検索し、
//それは検索ボックスから正当なものである、箱が正当である予測

# -*- coding:utf-8 -*-
class Solution:
    def movingCount(self, threshold, rows, cols):
        # write code here
        vis = [[0 for y in range(cols)] for x in range(rows)]
        def DFS(x,y):
            if x >= 0 and x < rows and y >= 0 and y < cols and vis[x][y] == 0 and sum(map(int,str(x)+str(y))) <= threshold:
                vis[x][y] = 1
                return DFS(x-1,y) + DFS(x+1,y) + DFS(x,y-1) + DFS(x,y+1) + 1
            return 0
        return DFS(0,0)

概要:この時点では、最初のパスを完了するために、提供対象を獲得、次の問題、Zhentiとleetcodeに焦点を当て、我々はすべて、熟練した独立した完全オリジナルタイトル変形問題なければなりません、少し旗を立て、安全性の三つの問題を証明する最初のステップになります時間とZhenti 200 +、leetcode 300+タイトル、給油

おすすめ

転載: blog.csdn.net/Leia21/article/details/90233948