- 题目:
地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?
- 思路:首先不能直接遍历整个数组,判断小于18的格子有多少个,因为我们得保证路径是连通的,要不然机器人无法到达。为了保证是连通路径,采用递归的方式,模拟机器人先走,从起点开始,一格一格的找,找到所有路径所有能到达格子的总和。
- 代码:
class Solution {
public int movingCount(int threshold, int rows, int cols)
{
int flag[][]=new int[rows][cols];// 建一个数组,来记录是否已经走过,和路径规划中的禁忌表一个道理
// 初始为0,走过的点 记为1
return helper(0,0,rows,cols,flag,threshold);//从起点开始
}
private int helper(int i,int j,int rows,int cols,int[][] flag,int threshold){
//如果越界了,或者当前点的阈值大于给定的,或者这个点时已经走过的点,那么返回0
if(i<0||i>=rows||j < 0 || j >= cols||numSum(i)+numSum(j)>threshold|| flag[i][j] == 1){
return 0;
}
flag[i][j]=1;//表示该点已经走过;
//返回 往上下左右四个方向不断找的结果,再加上自身这个1.总数即为所求。
return helper(i-1,j,rows,cols,flag,threshold)
+helper(i+1,j,rows,cols,flag,threshold)
+helper(i,j-1,rows,cols,flag,threshold)
+helper(i,j+1,rows,cols,flag,threshold)
+1;
}
private int numSum(int i) {
int sum = 0;
do{
sum += i%10; }
while((i = i/10) > 0);
return sum; }
}