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

2020-03-29  本文已影响0人  1只特立独行的猪

题目描述

地上有一个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

示例2:

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

提示:
1 <= n,m <= 100
0 <= k <= 20

解答方法

方法一:BFS

思路

广度优先搜索一般使用队列来实现。我们先将 (0, 0)加入队列,当队列不为空时,每次将队首坐标出队,加入到集合中,再将满足以上两个条件的坐标加入到队尾,直到队列为空。

代码

class Solution:
    def movingCount(self, m: int, n: int, k: int) -> int:
        def sums(x):
            sum = 0
            while x:
                sum += x%10
                x //= 10
            return sum
        marked = set()
        queue = [(0, 0)]
        while queue:
            x, y = queue.pop(0)
            if (x, y) not in marked and sums(x)+sums(y) <=k:
                marked.add((x,y))
                #仅考虑向右和向下
                for dx, dy in [(0,1), (1, 0)]:
                    new_x = x + dx
                    new_y = y + dy
                    if new_x >=0 and new_x < m and new_y >=0 and new_y < n:
                        queue.append((new_x, new_y))
        return len(marked)

时间复杂度

O(m×n)

空间复杂度

O(m×n)

上一篇下一篇

猜你喜欢

热点阅读