矩阵中的路径(动态规划,回溯)


请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。

路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。

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

思路,主函数设计循环从矩阵的每个位置开始调用辅助函数判断以此位置开始是否有这条路径。

辅助函数判断开始位置上下左右移动是否和路径一致,判断边界,出栈之后将路径记录重置。

# -*- coding:utf-8 -*-
class Solution:
    def hasPath(self, matrix, rows, cols, path):
        # write code here
        if matrix == '' or rows <= 0 or cols <= 0 or path == '':
            return False
        #记录路径是否走过
        flag = [0]*len(matrix)
        for i in xrange(rows):
            for j in xrange(cols):
                #如果有一个路径满足,则返回True
                if self.finPath(matrix, rows, cols, i, j, path, flag, 0):
                    return True

        del flag
        return False
    def finPath(self, matrix, rows, cols, i, j, path, flag, k):
        index = i * cols + j
        if i < 0 or j < 0 or i >= rows or j >= cols or k > len(path)-1 or path[k] != matrix[index]  or flag[index] == 1:
            return False
        #走到最后一位返回True
        if k == len(path)-1:
            return True
        flag[index] = 1
        #上下左右
        if  self.finPath(matrix, rows, cols, i+1, j,   path, flag, k+1) or \
            self.finPath(matrix, rows, cols, i-1, j,   path, flag, k+1) or \
            self.finPath(matrix, rows, cols, i,   j+1, path, flag, k+1) or \
            self.finPath(matrix, rows, cols, i,   j-1, path, flag, k+1):
            return True
        #出栈重置
        flag[index] = 0
        #完全出栈还没有返回值,说明不存在这条路径
        return False

so = Solution()
matrix = 'ABCESFCSADEE'
matrix = ''.join(matrix)
path = 'ABCB'
path = ''.join(path)
print so.hasPath(matrix, 3, 4, path)

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM