《剑指offer》-算法篇-回溯

题目

  1. 矩阵中的路径

  2. 机器人的运动范围

代码实现

矩阵中的路径

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

思路:从任意结点开始,任选该结点的某一个方向,判断结点在某一方向的值是否等于路径中的数值。确定每一步都是正确的情况下,再考虑下一步,这也和"广度优先遍历"是类似的。

python 复制代码
# -*- coding:utf-8 -*-
def BFS(matrix, row, col, path, visited):
    if row < 0 or row >= len(matrix) or col < 0 or col >= len(matrix[0]) or visited[row][col]: 
        return False
    if path[0] == matrix[row][col]:
        if len(path) == 1:
            return True
        visited[row][col] = 1
        if BFS(matrix, row+1, col, path[1:], visited) or \
            BFS(matrix, row-1, col, path[1:], visited) or \
            BFS(matrix, row, col-1, path[1:], visited) or \
            BFS(matrix, row, col+1, path[1:], visited):
            return True
        return False
    else:
        return False
    
class Solution:
    def hasPath(self, matrix, rows, cols, path):
        # write code here
        array = list(matrix)
        array = [array[i*cols:(i+1)*cols] for i in range(rows)]
        for i in range(rows):
            for j in range(cols):
                visited = [[0] * len(array[0]) for _ in range(len(array))]
                if BFS(array, i, j, list(path), visited): 
                    return True
        return False

机器人的运动范围

题目描述:地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?

思路:和第34题类似,也是要判断每一步是否满足格子的横纵坐标和的不等式约束。

python 复制代码
# -*- coding:utf-8 -*-
def getN(i, j):
    res = 0
    while i:
        res += (i % 10)
        i //= 10
    while j:
        res += (j % 10)
        j //= 10
    return res
 
def DFS(array, i, j, threshold, visited):
    if i<0 or j<0 or i>len(array)-1 or j>len(array[0])-1 or array[i][j]>threshold or visited[i][j]:
        return 0
    res = 1
    visited[i][j] = 1
    res += DFS(array, i+1, j, threshold, visited)
    res += DFS(array, i-1, j, threshold, visited)
    res += DFS(array, i, j+1, threshold, visited)
    res += DFS(array, i, j-1, threshold, visited)
    return res
 
class Solution:
    def movingCount(self, threshold, rows, cols):
        # write code here
        array = []
        for i in range(rows):
            res = []
            for j in range(cols):
                res.append(getN(i, j))
            array.append(res)
        from pprint import pprint
        pprint(array)
        visited = [[0] * len(array[0]) for _ in range(len(array))]
        return DFS(array, 0, 0, threshold, visited)

结尾

亲爱的读者朋友:感谢您在繁忙中驻足阅读本期内容!您的到来是对我们最大的支持❤️

正如古语所言:"当局者迷,旁观者清"。您独到的见解与客观评价,恰似一盏明灯💡,能帮助我们照亮内容盲区,让未来的创作更加贴近您的需求。

若此文给您带来启发或收获,不妨通过以下方式为彼此搭建一座桥梁: ✨ 点击右上角【点赞】图标,让好内容被更多人看见 ✨ 滑动屏幕【收藏】本篇,便于随时查阅回味 ✨ 在评论区留下您的真知灼见,让我们共同碰撞思维的火花

我始终秉持匠心精神,以键盘为犁铧深耕知识沃土💻,用每一次敲击传递专业价值,不断优化内容呈现形式,力求为您打造沉浸式的阅读盛宴📚。

有任何疑问或建议?评论区就是我们的连心桥!您的每一条留言我都将认真研读,并在24小时内回复解答📝。

愿我们携手同行,在知识的雨林中茁壮成长🌳,共享思想绽放的甘甜果实。下期相遇时,期待看到您智慧的评论与闪亮的点赞身影✨!


自我介绍:一线互联网大厂资深算法研发(工作6年+),4年以上招聘面试官经验(一二面面试官,面试候选人400+),深谙岗位专业知识、技能雷达图,已累计辅导15+求职者顺利入职大中型互联网公司。熟练掌握大模型、NLP、搜索、推荐、数据挖掘算法和优化,提供面试辅导、专业知识入门到进阶辅导等定制化需求等服务,助力您顺利完成学习和求职之旅(有需要者可私信联系)

友友们,自己的知乎账号为**"快乐星球"**,定期更新技术文章,敬请关注!