"ABCESFCSADEE",3,4,"ABCCED"
true
"ABCESFCSADEE",3,4,"ABCB"
false
# -*- coding:utf-8 -*- class Solution: def hasPath(self, matrix, rows, cols, path): for k, v in enumerate(matrix): if v == path[0]: row, col = k // cols, k % cols xx = self.cover(matrix, cols) # TODO 二维数组的巨坑,任何赋值都是引用,每次都重新生成数组 if self.path(xx, row, col, path): return True return False # write code here def path(self, xx, rows, cols, value): try: if not value: return True if xx[rows][cols] == value[0]: xx[rows][cols] = "null" # 不能往回走 value = value[1:] return self.path(xx, rows + 1, cols, value)&nbs***bsp;self.path(xx, rows, cols + 1, value)&nbs***bsp;self.path(xx, rows - 1, cols, value)&nbs***bsp;self.path( xx, rows, cols - 1, value) except: return False def cover(self, matrix, cols): ll = [] for i in range(0, len(matrix), cols): l = [] for j in matrix[i:i + cols]: l.append(j) ll.append(l) return ll
class Solution: def hasPath(self, matrix, rows, cols, path): self.flag_ = False if not matrix: return False if not path: return True matrix = [list(matrix[cols*i:cols*i+cols]) for i in range(rows)] for row in range(rows): for col in range(cols): if matrix[row][col] == path[0]: self.mat = [[0 for j in range(cols)] for i in range(rows)] self.dfs(matrix,row,col, rows, cols, path) if self.flag_: return self.flag_ return self.flag_ def dfs(self, matrix,row,col, rows, cols, path): if not path: self.flag_ = True return if row >= rows&nbs***bsp;col >= cols&nbs***bsp;row < 0&nbs***bsp;col < 0: return if matrix[row][col] != path[0]: return if self.mat[row][col] == -1: return self.mat[row][col] = -1 self.dfs(matrix, row, col+1, rows, cols, path[1:]) self.dfs(matrix, row+1, col, rows, cols, path[1:]) self.dfs(matrix, row, col-1, rows, cols, path[1:]) self.dfs(matrix, row-1, col, rows, cols, path[1:]) return
# -*- coding:utf-8 -*- class Solution: def hasPath(self, matrix, rows, cols, path): (1926)# write code here def backtrack(matrix,i,j,path): if i < 0&nbs***bsp;j < 0: return False if i >= rows&nbs***bsp;j >= cols: return False if matrix[i][j] == path[0] and len(path) == 1: return True elif matrix[i][j] == path[0] and len(path) > 1: t = list(matrix[i]) t[j] = "0" matrix[i] = ''.join(t) a=backtrack(matrix,i+1,j,path[1:]) b=backtrack(matrix, i, j+1, path[1:]) c=backtrack(matrix, i - 1, j, path[1:]) d=backtrack(matrix, i, j - 1, path[1:]) if a&nbs***bsp;b&nbs***bsp;c&nbs***bsp;d: return True else: return False tmp = [] while matrix: tmp.append(matrix[:cols]) matrix =matrix[cols:] for i in range(rows): for j in range(cols): if tmp[i][j] == path[0]: s = tmp[:] a = backtrack(s,i,j,path) if not a: continue else: return True return False
# -*- coding:utf-8 -*- class Solution: def hasPath(self, matrix, rows, cols, path): # write code here if matrix==None&nbs***bsp;rows<1&nbs***bsp;cols<1&nbs***bsp;path==None: return False #用来判定该格子是否已经访问过了 visited=[0 for i in range(rows*cols)] pathlength=0 for x in range(rows): for y in range(cols): #此处是用于找到最开始的起点 if self.haspathcore(matrix,rows,cols,x,y,path,pathlength,visited): return True return False def haspathcore(self,matrix,rows,cols,row,col,path,pathlength,visited): if pathlength>=len(path): #字符序列中字符都已匹配完成 return True haspath=False if row>=0 and row<rows and col>=0 and col<cols and matrix[row*cols+col]==path[pathlength] and not visited[row*cols+col]: #当字符串匹配时就去找寻下一个格子的位置,有四种情况,只要有一种符合就够了 pathlength+=1 visited[row*cols+col]=1 haspath=self.haspathcore(matrix,rows,cols,row,col-1,path,pathlength,visited) \ &nbs***bsp;self.haspathcore(matrix,rows,cols,row,col+1,path,pathlength,visited) \ &nbs***bsp;self.haspathcore(matrix,rows,cols,row-1,col,path,pathlength,visited) \ &nbs***bsp;self.haspathcore(matrix,rows,cols,row+1,col,path,pathlength,visited) if not haspath: #如果往四个方向都没有匹配到下一个字符,则进行回溯 pathlength-=1 visited[row*cols+col]=0 return haspath首先我们需要找到初始格子,然后就是从初始格子出发,当前格子与字符序列当前位置如果匹配的话,就寻找下一个格子,下一个格子是从四个方向上进行寻找。如果都没有找到就利用回溯的方法。回溯是在判定四个方向都无匹配的字符时才进行回溯。以此直到结束。
# -*- coding:utf-8 -*- class Solution: def hasPath(self, matrix, rows, cols, path): # write code here if not matrix: return False entry = [i for i, v in enumerate(matrix) if v == path[0]] for e in entry: stack = [(e, -1)] past = [e] k = 1 while stack and k < len(path): tar = path[k] pos, direct = stack.pop() d = direct + 1 while d < 4: if (d == 0 and pos//cols >= 1 and pos-cols not in past and matrix[pos-cols] == tar) \ &nbs***bsp;(d == 1 and pos%cols <= cols-2 and pos+1 not in past and matrix[pos+1] == tar) \ &nbs***bsp;(d == 2 and pos//cols <= rows-2 and pos+cols not in past and matrix[pos+cols] == tar) \ &nbs***bsp;(d == 3 and pos%cols >= 1 and pos-1 not in past and matrix[pos-1] == tar): break d += 1 if d < 4: new_pos = {0: pos-cols, 1: pos+1, 2: pos+cols, 3: pos-1}[d] past.append(new_pos) stack.append((pos, d)) stack.append((new_pos, -1)) k += 1 else: # d >= 4 k -= 1 if k == len(path): return True return False
class Solution: def hasPath(self, matrix, m, n, path): if m == 0&nbs***bsp;n == 0: return False def dfs(i, j, level): if level >= len(path) - 1: return True r = False for (x, y) in [(i - 1, j), (i + 1, j), (i, j - 1), (i, j + 1)]: if 0 <= x < m and 0 <= y < n and (x, y) not in vis and matrix[x*n+y] == path[level + 1]: vis.add((x, y)) r = r&nbs***bsp;dfs(x, y, level + 1) return r res = False for i in range(m): for j in range(n): if matrix[i*n+j] == path[0]: vis = set([(i, j)]) res = res&nbs***bsp;dfs(i, j, 0) return res
# -*- coding:utf-8 -*- # 解体思路:回溯法+深度优先搜素,结束条件:矩阵中找到一条路径与path匹配(长度相等且每个字符相等) # 判断当前字符是否计入路径的条件:1.坐标不越界 2.字符与path预期相等 3.该字符没有被访问过 class Solution: def hasPath(self, matrix, rows, cols, path): # write code here if not matrix&nbs***bsp;rows < 1&nbs***bsp;cols < 1&nbs***bsp;not path: return False index = 0 visited = [[False for j in range(0, cols)] for i in range(0, rows)] def hasPathCore(matrix, row, col, index, path): flag = False if 0 <= row < rows and 0 <= col < cols and matrix[row * cols + col] == path[index] and not visited[row][col]: if index + 1 == len(path): return True index += 1 visited[row][col] = True flag = hasPathCore(matrix, row + 1, col, index, path) \ &nbs***bsp;hasPathCore(matrix, row, col + 1, index, path) \ &nbs***bsp;hasPathCore(matrix, row - 1, col, index, path) \ &nbs***bsp;hasPathCore(matrix, row, col - 1, index, path) if not flag: index -= 1 visited[row][col] = False return flag for i in range(0, rows): for j in range(0, cols): if hasPathCore(matrix, i, j, index, path): return True return False
# -*- coding:utf-8 -*- class Solution: def hasPath(self, matrix, rows, cols, path): # write code here # 回溯算法 # 在循环中查找每次的字符串首字母 # 给定的数组是一行的,rows,cols告诉一共包含几行几列的数据 # 可能有多个False,只要有一个True,就算成功 # 找到第一个点后开始嵌套 for i in range(rows): for j in range(cols): judge=[True]*len(matrix) if self.ispath(matrix,rows,cols,i,j,path,judge): return True return False def ispath(self,matrix,rows,cols,i,j,path,judge): #判断i,j点开始的路径是否是path if path=='': #先确认path已经空了 return True if i>=rows&nbs***bsp;j>=cols&nbs***bsp;i<0&nbs***bsp;j<0: #再确认i,j没有超范围 return False if judge[i*cols+j]==False: #再确认是否碰到了标记false点 return False if matrix[i*cols+j]==path[0]: judge[i*cols+j]=False return ( self.ispath(matrix,rows,cols,i-1,j,path[1:],judge)&nbs***bsp; self.ispath(matrix,rows,cols,i+1,j,path[1:],judge)&nbs***bsp; self.ispath(matrix,rows,cols,i,j-1,path[1:],judge)&nbs***bsp; self.ispath(matrix,rows,cols,i,j+1,path[1:],judge) ) #上下左右 else: return False
# -*- coding:utf-8 -*- class Solution: def hasPath(self, matrix, rows, cols, path): #构造矩阵 m=[] c=0 for i in range(rows): l=[] for j in range(cols): l.append(matrix[c]) c+=1 m.append(l) d=[[1,0],[-1,0],[0,1],[0,-1]] #定义dfs函数 def dfs(x,y,path): if not path: return True for dx,dy in d: if 0<=x+dx<rows and 0<=y+dy<cols and (x+dx,y+dy) not in visited and m[x+dx][y+dy]==path[0]: visited.add((x+dx,y+dy)) if dfs(x+dx,y+dy,path[1:]): return True visited.remove((x+dx,y+dy)) #已经走过的路记录下来 visited=set() for i in range(rows): for j in range(cols): #以第一个字母为起点 if m[i][j]==path[0]: visited.add((i,j)) if dfs(i,j,path[1:]): return True visited.remove((i,j))
class Solution: def hasPath(self, matrix, rows, cols, path): if not path: return True self.rows, self.cols = rows, cols for j in range(cols): for i in range(rows): if matrix[i*cols+j] == path[0] and self.hasPathAux(matrix, [(i,j)], path[1:]): return True return False def hasPathAux(self, matrix, mark, path): (i,j) = mark[-1] return not path or (i - 1 >= 0) and ((i-1,j) not in mark) and (matrix[(i-1)*self.cols+j] == path[0]) and self.hasPathAux(matrix, mark+[(i-1,j)], path[1:]) or (i + 1 < self.rows) and ((i+1,j) not in mark) and (matrix[(i+1)*self.cols+j] == path[0]) and self.hasPathAux(matrix, mark+[(i+1,j)], path[1:]) or (j - 1 >= 0) and ((i,j-1) not in mark) and (matrix[i*self.cols+(j-1)] == path[0]) and self.hasPathAux(matrix, mark+[(i,j-1)], path[1:]) or (j + 1 < self.cols) and ((i,j+1) not in mark) and (matrix[i*self.cols+(j+1)] == path[0]) and self.hasPathAux(matrix, mark+[(i,j+1)], path[1:])
class Solution: def hasPath(self, matrix, rows, cols, path): self.is_visited = [[0 for i in range(cols)] for i in range(rows)] self.matrix = matrix self.rows = rows self.cols = cols self.length = len(path) for i in range(rows): for j in range(cols): if self.hasPathCore(i, j, path, 0): return True return False def hasPathCore(self, row, col, path, str_ind): if str_ind >= self.length: return True if self.judge_val(row, col) and path[str_ind] == self.matrix[row][col]: self.is_visited[row][col] = 1 if self.hasPathCore(row + 1, col, path, str_ind + 1) or self.hasPathCore(row - 1, col, path, str_ind + 1) or self.hasPathCore( row, col + 1, path, str_ind + 1) or self.hasPathCore(row, col - 1, path, str_ind + 1): return True else: self.is_visited[row][col] = 0 return False def judge_val(self, row, col): if 0 <= row < self.rows and 0 <= col < self.cols and not self.is_visited[row][col]: return True else: return False
# -*- coding:utf-8 -*- class Solution: def hasPathCore(self, matrix, rows, cols, row, col, path, path_index, visited): if len(path) == path_index: return True if row >= 0 and row < rows and col >= 0 and col < cols and matrix[row * cols + col] == path[path_index] and not visited[row * cols + col]: visited[row * cols + col] = True if self.hasPathCore(matrix, rows, cols, row, col - 1, path, path_index + 1, visited) or self.hasPathCore(matrix, rows, cols, row - 1, col, path, path_index + 1, visited) or self.hasPathCore(matrix, rows, cols, row, col + 1, path, path_index + 1, visited) or self.hasPathCore(matrix, rows, cols, row + 1, col, path, path_index + 1, visited): return True visited[row * cols + col] = False return False def hasPath(self, matrix, rows, cols, path): # write code here if matrix is None or rows < 1 or cols < 1 or path is None: return False for row in range(rows): for col in range(cols): visited = [False] * (rows * cols) if self.hasPathCore(matrix, rows, cols, row, col, path, 0, visited): print(True) return True print(False) return FalsePython简明代码
# -*- coding:utf-8 -*- class Solution: def hasPath(self, matrix, rows, cols, path): # write code here #标志位初始化为False flag = [False]*len(matrix) for i in range(rows): for j in range(cols): if(self.judge(matrix,i,j,rows,cols,flag,path,0)): return True return False def judge(self,matrix,i,j,rows,cols,flag,path,k): #计算匹配的第一个元素转为一维数组的位置 index = i*cols+j if(k==len(path)-1): return True #递归终止条件 if(i<0 or i>=rows or j<0 or j>=cols or matrix[index]!=path[k] or flag[k]==True): return False #若k已经到达str末尾了,说明之前的都已经匹配成功了,直接返回true即可 if(k==len(path)-1): return True #已经走过此元素,将标志位设成true flag[index]=True #回溯,递归寻找,每次找到了就给k加一 if(self.judge(matrix,i-1,j,rows,cols,flag,path,k+1) or self.judge(matrix,i+1,j,rows,cols,flag,path,k+1) or self.judge(matrix,i,j-1,rows,cols,flag,path,k+1) or self.judge(matrix,i,j+1,rows,cols,flag,path,k+1) ): return True #走到这,说明这一条路不通,还原标志位返回上一个情况,再试其他的路径 flag[index]=False return False求问这个为什么不对~
# -*- coding:utf-8 -*- class Solution: def __init__(self): self.j = 0 self.ans = [] self.flag = [] def hasPath(self, matrix, rows, cols, path): def Path(row,col,matrix,rows,cols,path): if self.j == len(path): return if row<0 or row>rows-1 or col<0 or col>cols-1: return index = row*cols+col if matrix[index] == path[self.j] and self.flag[index]==0: self.flag[index] = 1 self.ans.append(index) self.j += 1 if self.j == len(path): return Path(row,col+1,matrix,rows,cols,path) Path(row,col-1,matrix,rows,cols,path) Path(row+1,col,matrix,rows,cols,path) Path(row-1,col,matrix,rows,cols,path) if self.j == len(path): return self.j -= 1 self.ans.pop() self.flag[index] = 0 self.flag = [0] * len(matrix) for i,x in enumerate(matrix): if x == path[0]: row = i//cols col = i%cols Path(row,col,matrix,rows,cols,path) if len(self.ans) == len(path): return True return False
class Solution:
def hasPath(self, matrix, rows, cols, path):
if not matrix:#没有返回False
return False
if not path:
return True#没有path返回True
x = [list(matrix[cols*i:cols*i+cols]) for i in range(rows)]#矩阵是一行,生成一个cols行rows列的矩阵
#matrix=[1,2,3,4,5,6,7,6,5] x=[[1, 2, 3], [4, 5, 6], [7, 6, 5]]
for i in range(rows):
for j in range(cols):
if self.exist_helper(x, i, j, path):#遍历找,其实不是很理想
return True
return False
def exist_helper(self, matrix, i, j, p):
if matrix[i][j] == p[0]:#先比较第一个元素
if not p[1:]:#只有一个元素的情况
return True
matrix[i][j] = ''
if i > 0 and self.exist_helper(matrix, i-1, j, p[1:]):#左边递归
return True
if i < len(matrix)-1 and self.exist_helper(matrix, i+1, j ,p[1:]):#右边递归
return True
if j > 0 and self.exist_helper(matrix, i, j-1, p[1:]):#下面递归
return True
if j < len(matrix[0])-1 and self.exist_helper(matrix, i, j+1, p[1:]):#上边递归
return True
matrix[i][j] = p[0]#在上述上下左右遍历后该点已经访问过
return False#之前情况都不满足,返回False
else:
return False
对一个牛油思路的解释
# -*- coding:utf-8 -*- class Solution: def hasPath(self, matrix, rows, cols, path): # write code here self.flags = [0 for _ in range(len(matrix))] self.matrix, self.rows, self.cols, self.path = matrix, rows, cols, path for i in range(rows): for j in range(cols): if self.search(i, j, 0): return True return False def search(self, i, j, k): index = self.cols * i + j if not 0 <= i < self.rows or not 0 <= j < self.cols or \ self.flags[index] or self.matrix[index] != self.path[k]: return False # 越界 or 已经走过 or 不是所需节点 if k == len(self.path) - 1: return True # 已经找完,不需要继续递归 self.flags[index] = 1 # 走过这个点,寻找下个点 if self.search(i+1, j, k+1) or self.search(i-1, j, k+1) or \ self.search(i, j+1, k+1) or self.search(i, j-1, k+1): return True # 四条路中有一条可以走通 self.flags[index] = 0 # 如果无法走通,要释放这个点,以防影响其他路线中走此点 return False
def hasPath(self, matrix, rows, cols, path): if rows == 0 or cols == 0: return False matrix_mat = [] for i in range(rows): temp = [] for j in range(cols): temp.append(matrix[i*cols + j]) matrix_mat.append(temp) for i in range(rows): for j in range(cols): if self.df***atrix_mat, i, j, path): return True return False def dfs(self, matri***ath): if len(path) == 0: return True if i < 0 or i >= len(matrix) or j < 0 or j >= len(matrix[0]) or path[0] != matrix[i][j]: return False # 如果以上不返还说明当前的matrix[i][j]等于path[0] # 对上下左右进行搜索,令path=path[1:] # 用一个temp保存当前值,将当前位置置为#,避免重复搜索 temp = matrix[i][j] matrix[i][j] = "#" if self.df***atrix, i+1, j, path[1:]): return True if self.df***atrix, i-1, j, path[1:]): return True if self.df***atrix, i, j+1, path[1:]): return True if self.df***atrix, i, j-1, path[1:]): return True # 用temp将当前位置重新置为原来的字母 matrix[i][j] = temp return False
分析:回溯算法 这是一个可以用回朔法解决的典型题。首先,在矩阵中任选一个格子作为路径的起点。如果路径上的第i个字符不是ch,那么这个格子不可能处在路径上的 第i个位置。如果路径上的第i个字符正好是ch,那么往相邻的格子寻找路径上的第i+1个字符。除在矩阵边界上的格子之外,其他格子都有4个相邻的格子。 重复这个过程直到路径上的所有字符都在矩阵中找到相应的位置。 由于回朔法的递归特性,路径可以被开成一个栈。当在矩阵中定位了路径中前n个字符的位置之后,在与第n个字符对应的格子的周围都没有找到第n+1个 字符,这个时候只要在路径上回到第n-1个字符,重新定位第n个字符。 由于路径不能重复进入矩阵的格子,还需要定义和字符矩阵大小一样的布尔值矩阵,用来标识路径是否已经进入每个格子。 当矩阵中坐标为(row,col)的 格子和路径字符串中相应的字符一样时,从4个相邻的格子(row,col-1),(row-1,col),(row,col+1)以及(row+1,col)中去定位路径字符串中下一个字符 如果4个相邻的格子都没有匹配字符串中下一个的字符,表明当前路径字符串中字符在矩阵中的定位不正确,我们需要回到前一个,然后重新定位。 一直重复这个过程,直到路径字符串上所有字符都在矩阵中找到合适的位置 class Solution { public: bool hasPath(char* matrix, int rows, int cols, char* str) { if(str==NULL||rows<=0||cols<=0) return false; bool *isOk=new bool[rows*cols](); for(int i=0;i<rows;i++) { for(int j=0;j<cols;j++) if(isHsaPath(matrix,rows,cols,str,isOk,i,j)) return true; } return false; } bool isHsaPath(char *matrix,int rows,int cols,char *str,bool *isOk,int curx,int cury) { if(*str=='\0') return true; if(cury==cols) { curx++; cury=0; } if(cury==-1) { curx--; cury=cols-1; } if(curx<0||curx>=rows) return false; if(isOk[curx*cols+cury]||*str!=matrix[curx*cols+cury]) return false; isOk[curx*cols+cury]=true; bool sign=isHsaPath(matrix,rows,cols,str+1,isOk,curx-1,cury) ||isHsaPath(matrix,rows,cols,str+1,isOk,curx+1,cury) ||isHsaPath(matrix,rows,cols,str+1,isOk,curx,cury-1) ||isHsaPath(matrix,rows,cols,str+1,isOk,curx,cury+1); isOk[curx*cols+cury]=false; return sign; } };