地上有一个 rows 行和 cols 列的方格。坐标从 [0,0] 到 [rows-1,cols-1] 。一个机器人从坐标 [0,0] 的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于 threshold 的格子。 例如,当 threshold 为 18 时,机器人能够进入方格 [35,37] ,因为 3+5+3+7 = 18。但是,它不能进入方格 [35,38] ,因为 3+5+3+8 = 19 。请问该机器人能够达到多少个格子?
数据范围: 0≤threshold≤15 0≤threshold≤15 ,1≤rows,cols≤100 1≤rows,cols≤100
m = 10, n = 5
00 01 02 03 04 05 06 07 08 09
10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
30 31 32 33 34 35 36 37 38 39
40 41 42 43 44 45 46 47 48 49
if thresold = 3, 能走的路径:00 01 02 03,10,11 ,12,20 ,21,30, row+col <=3
if thresold = 8,能走的路径: 00~08, 10~17, 20~26,30~35,40~44, row+col<=8
数位和:123456----->1+2+3+4+5+6,
row = 10, col = 11 ------>数位和:1+0+1+1 = 3
cpp
#include <vector>
class Solution {
public:
int movingCount(int threshold, int rows, int cols) {
if(threshold < 0 || rows <= 0 || cols <= 0){
return 0;
}
vector<vector<bool>> visited(rows, vector<bool> (cols, false));
int count = movingCountCore(threshold, rows, cols, 0, 0, visited);
return count;
}
//数位之和
int getDigitSum(int number){ //row = 10, column = 11, 数位之和sum = 3
int sum = 0;
while(number>0){
sum += number%10;
number /= 10;
}
return sum;
}
int movingCountCore(int threshold,int rows, int cols, int row, int column, vector<vector<bool>> &visited){
if(row < 0 ||row >= rows ||
column <0 || column >= cols||
getDigitSum(row) + getDigitSum(column) > threshold //数位之和
// row + column > threshold //row < 10, column < 10这种情况是可以的,
//row=10,column = 10的时候,数位之和 sum = 2
|| visited[row][column] //true表示已访问
) return false;
visited[row][column] = true;
//往四个方向dfs
return 1+movingCountCore(threshold, rows, cols, row+1, column, visited)+
movingCountCore(threshold, rows, cols, row-1, column, visited)+
movingCountCore(threshold, rows, cols, row, column+1, visited)+
movingCountCore(threshold, rows-1, cols, row, column-1, visited);
}
};