【剑指offer】矩阵中的路径(python)
1. str转换为list
在将str转化为list时,主要就是通过str的split()函数,split()参数为空时,默认以空格来做分割。
直接通过list转换时是以每一个字符为分割的。
2. python申明多维数组
list_three = [[0 for i in range(3)] for j in range(3)]
注意方括号
3. 回溯法
一种暴力搜索方法,在一次搜索结束时需要进行回退,将这一次搜索过程中设置的状态清楚,再开始一次新的搜索过程。
mark[r][c] = True for i in self.next: if self.backTrack(matrix, pathList, mark, pathLen+1, r+i[0], c+i[1]): return True mark[r][c] = False这里就表示,从[r][c]开始,设置为True,下一步搜索四个方向,下一次搜索结束后,将[r][c]状态清除。
这里next = [[0,-1],[0,1],[-1,0],[1,0]],标记了下次搜索的可能方向。
# # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # # @param matrix string字符串 # @param rows int整型 # @param cols int整型 # @param str string字符串 # @return bool布尔型 # class Solution: next = [[1,0],[-1,0],[0,1],[0,-1]] def hasPath(self , matrix , rows , cols , str ): # write code here if (rows == 0) or (cols == 0): return False matrix = self.buildMatrix(matrix, rows, cols) targetPath = list(str) mark = [[False for i in range(cols)] for j in range(rows)] for i in range(rows): for j in range(cols): if self.backTravesal(matrix, mark, targetPath, 0, i, j): return True return False def backTravesal(self, matrix, mark,targetPath, targetPathIndex, r, c): if targetPathIndex == len(targetPath): return True rows = len(matrix) cols = len(matrix[0]) if (r < 0) or (r >= rows) or (c < 0) or (c >= cols) or mark[r][c] or (matrix[r][c]!= targetPath[targetPathIndex]): return False mark[r][c] = True for i in self.next: if self.backTravesal(matrix, mark, targetPath, targetPathIndex+1, r+i[0], c+i[1]): return True mark[r][c] = False return False def buildMatrix(self, string, rows, cols): matrix = [[-1 for i in range(cols)] for j in range(rows)] stringList = list(string) index = 0 for i in range(rows): for j in range(cols): matrix[i][j] = stringList[index] index += 1 return matrix