回溯法-065-矩阵中的路径

题目描述

请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左向右向上向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。

示例

例如:

a b c e
s f c s
a d e e

矩阵中包含一条字符串"bcced“的路径,但是矩阵中不包含”abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。

分析

  1. 首先确定利用回溯法进行求解。
    1. 确立解空间-子集树空间
      在这里插入图片描述
    2. 利用深度优先搜索。
    3. 确立剪枝条件。
      1. 搜索越出矩阵范围,停止向下搜索,剪枝。
      2. 不是目标字符,停止向下搜索,剪枝。
      3. 已经被搜索比较过,停止向下所搜,剪枝。

代码

class Solution:
	def __init__(self):
		self.matrix = []
		self.rows = 0
		self.cols = 0
		self.n = 0
		self.tarStr = []
		self.assistMat = []

	def conflict(self, k, row, col):   # 剪枝冲突检测
		index = row*self.cols+col
		if self.rows>row>=0 and self.cols>col>=0 and self.matrix[index]==self.tarStr[k] and not self.assistMat[index]:
			return False
		else:
			return True

	def findpath(self, k, row, col):
		if k>=self.n:  # 搜索到目标字符串 搜索到最底层即为搜到目标字符串
			return True

		index = row*self.cols+col   # 索引位置
		if not self.conflict(k, row, col):   # 如果没冲突,向下搜索
			self.assistMat[index] = True    # 未冲突向下搜索前,该位置标志置true 代表搜索过了
			if (self.findpath(k+1, row-1, col) or 
				self.findpath(k+1, row+1, col) or 
				 self.findpath(k+1, row, col-1) or 
				  self.findpath(k+1, row, col+1)):    # 向四个方向搜索 任意方向搜索成功即为成功
				return True
			self.assistMat[index] = False   # 搜索都不成功时回溯并且返回False 搜索同样失败
			return False
		else:
			return False   # 有冲突直接返回Flase 搜索失败

	def hasPath(self, matrix, rows, cols, path):
		self.matrix = matrix
		self.rows = rows
		self.cols = cols
		self.tarStr = path
		self.n = len(path)
		self.assistMat = [False] * rows * cols   # 参数赋值
		for i in range(self.rows):
			for j in range(self.cols):
				if self.findpath(0, i, j):   #只要从任意地方开始有搜寻到该目标字符串 则返回 True
					return True

		return False 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章