矩阵中的路径

题目描述

请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。 例如 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)]
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容

  • 习惯github pages风格的请看我的另一篇博客 题目12:矩阵中的路径 请设计一个函数,用来判断在一个矩阵中...
    stoneyang94阅读 200评论 0 0
  • 本文首发于我的个人博客:尾尾部落 题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的...
    繁著阅读 525评论 0 1
  • 题目要求: 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个...
    Rarestzhou阅读 213评论 0 0
  • 题目描述请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子...
    NoFacePeace阅读 242评论 0 0
  • JJ送送送MSN静静民工民
    米拉大公阅读 92评论 0 0