问题描述:
地上有一个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的解法代码。