美文网首页
矩阵中的路径

矩阵中的路径

作者: Max_7 | 来源:发表于2018-10-02 23:02 被阅读0次

    题目描述

    请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。 例如 a b c e s f c s a d e e 这样的3 X 4 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。

    思路

    这道题使用回溯法来解决,也是深搜的一种。 对于递归,通常有三个地方需要考虑,
    1 是递归的定义,把问题转化为递归,要递归哪些方面。
    2 是递归的拆解,如果把问题实际转化成递归问题。
    3 是递归的出口,当递归发现解之后,如何返回,如何一步一步返回上一层。
    在使用回溯方法的时候,通常会有一个栈来记录搜索过的正确的路径,到达当前一个状态后,会先尝试把当前的节点/状态入栈,如果无解再返回。
    针对本问题,具体思路是: 遍历矩阵,找到开头后,开始递归的对问题求解。用index来记录目标字符串的位置,寻找到解以后,就把index+1,尝试无解后回溯到index-1. 因为题目要求同一个格子不允许进入两次,所以再额外构建一个二维矩阵用来记录每个格子是否被访问过。

    代码

    # -*- coding:utf-8 -*-
    class Solution:
        def hasPath(self, matrix, rows, cols, path):
            #特殊情况判断
            if matrix is None or rows<1 or cols <1 or path is None:
                return False
            #题目输入不是二维数组,将长序列变成2维数组
            temp_matrix =[['' for j in range(cols)] for i in range(rows)]
            count=0
            for i in range(rows):
                for j in range(cols):
                    temp_matrix[i][j]=matrix[count]
                    count+=1
            #分别是访问矩阵和下标
            visited = [[0]* cols for i in range(rows)]
            index = 0
            for i in range(rows):
                for j in range(cols):
                    if temp_matrix[i][j] == path[0]: #找到符合第一个开头的
                        if self.helper(temp_matrix,rows,cols,visited,path,index,i,j):
                            return True
            return False
        def helper(self,matrix,rows,cols,visited,path,index,row_index,column_index):
            if len(path) == index:  #最后的情况,证明前一个就是path最后了
                return True
            flag = False
            if (row_index >=0 and row_index < rows and column_index >=0
                and column_index <cols and matrix[row_index][column_index] == path[index]
                and not visited[row_index][column_index]): #判别情况,包括边界大小,目标值相等,没有访问过
                index = index+1
                visited[row_index][column_index] = True
                flag1 = self.helper(matrix,rows,cols,visited,path,index,row_index+1,column_index)
                flag2 = self.helper(matrix,rows,cols,visited,path,index,row_index-1,column_index)
                flag3 = self.helper(matrix,rows,cols,visited,path,index,row_index,column_index+1)
                flag4 = self.helper(matrix,rows,cols,visited,path,index,row_index,column_index-1)
                flag = flag1 or flag2 or flag3 or flag4  #4个flag表示按四个方向寻找
                if flag is False:  #寻找错误,回溯到前一个地方
                    index = index -1
                    visited[row_index][column_index] = False
            return flag
    

    这里有一个Python初始化二维数组的小技巧,记录一下

    N = [[0]*3 for i in range(10)]
    matrix =[[0 for j in range(cols)] for i in range(rows)]
    

    相关文章

      网友评论

          本文标题:矩阵中的路径

          本文链接:https://www.haomeiwen.com/subject/utmaoftx.html