题目
地上有一个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、广度优先搜索(BFS):一种图形搜索算法,以起始点呈辐射状向外遍历;
2、因为起点为[0,0],所以我们只需要向右和向下两个方向遍历;(向上和向左的格子已经访问过,不需重复计算)
3、如图像波浪形向外遍历:
BFS步骤
1、将起始格子添加到队列中;
2、操作当前格子,并获取下一层的格子;
- 获取当前遍历的格子;
- 剪枝;(不需要判断判断0越界的情况,因为只向右和向下两个方向遍历)
- 将符合要求的格子设置为已访问,可达格子数加1;
- 获取右边和下边格子,并添加到队列中。
3、如果存在格子,执行操作2;
4、返回可达格子数。
实现
class Solution {
public int movingCount(int m, int n, int k) {
// 保存可达的格子数
int result = 0;
// 记录已经访问过的格子(剪枝时使用)
boolean[][] visited = ne