LeetCode#面试题13. 机器人的运动范围

问题描述:

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

示例 1:

输入:m = 2, n = 3, k = 1
输出:3

示例 1:

输入:m = 3, n = 1, k = 0
输出:1

提示:

    1 <= n,m <= 100
    0 <= k <= 20

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/ji-qi-ren-de-yun-dong-fan-wei-lcof

 解题思路:

首先是搞清楚限制条件是两条:①不能超出方格外,考虑在遍历的过程中判断;②不能移至行坐标和列坐标的数位之和大于k的格子上。考虑写一个单独的方法求出数位之和。需要注意的是:题目中,给出1<=n,m<=100,因此考虑100及以内就可以。

其次是遍历方法有两种,一种是广度优先遍历。另一种深度优先遍历,主要是对于BFS和DFS遍历的代码模板的运用。下面的版本是使用双向队列的BFS来解决的Python版本的解法。我们先将 (0, 0)加入队列,当队列不为空时,每次将队首坐标出队,加入到集合中,再将满足以上两个条件的坐标加入到队尾,直到队列为空。

Python版本:

class Solution(object):
    def isLess(self, a,b):
        temp1 = a%10
        temp2 = a/10%10
        temp3 = b%10
        temp4 = b/10%10
        temp5 = (1 if(a == 100) else 0)
        temp6 = (1 if(b == 100) else 0)
        return temp1+temp2+temp3+temp4+temp5+temp6
    def movingCount(self, m, n, k):
        """
        :type m: int
        :type n: int
        :type k: int
        :rtype: int
        """
        visited = set()  # 将访问过的点添加到集合marked中,从(0,0)开始
        queue = collections.deque()
        queue.append((0,0))
        while queue:
            x, y = queue.popleft()
            if (x,y) not in visited and self.isLess(x,y) <= k:
                visited.add((x,y)) 
                for dx, dy in [(-1,0),(1,0),(0,1),(0,-1)]:
                    if 0 <= x + dx < m and 0 <= y + dy < n:
                        queue.append((x+dx,y+dy)) 
        return len(visited)

后续需要补充BFS以及DFS的代码模板。以及DFS的解法代码。

猜你喜欢

转载自blog.csdn.net/paranior/article/details/104350928