机器人的运动范围
题目描述
算法思路
-
其实算法思路很明确,只要从【0】【0】开始进行四个方向的搜索即可,这也是回溯问题
-
当机器人需要进入【i】【j】的时候,首先判断是否可以进入,
- 如果不符合,那就返回 0
- 如果符合,那就返回 1 + M1 + M2 + M3 + M4
- M1,M2,M3,M4 是指四个方向搜索可以到达的格子个数
- 所以这就是一个递归的写法
算法实现
- 这里在实现回溯的时候遇见了困难,由于对递归的不熟悉,不知道到底返回什么?
- 其实很简单,如果该位置符合,那么返回值至少为1,还要加上其余四个方向的格子个数
- 如果该位置不符合,那就返回0即可
public static int countNums(int[][] martix, int k){
//矩阵的行列
int m = martix.length;
int n = martix[0].length;
//记录是否已经走过 走过为1 没走过为0
int[][] isVisited = new int[m][n];
// int count = 0;
// int i = ifCounrt(martix, 0, 0, isVisited, k, count);
int count = ifCounrt(martix, 0, 0, isVisited, k);
return count;
}
public static int ifCounrt(int[][] martix, int row, int col, int[][] isVisited, int k){
int count = 0;
int m = martix.length;
int n = martix[0].length;
//判断该位置是否符合
if(row < 0 || row >= m || col < 0 || col >= n || isVisited[row][col] == 1
|| check(row,col) > k){
return 0;
}
//将该位置标志为已经走过
isVisited[row][col] = 1;
//计算 1 + 四个方向的格子个数
count = 1 +
ifCounrt(martix, row - 1, col, isVisited, k) +
ifCounrt(martix, row + 1, col, isVisited, k) +
ifCounrt(martix, row, col - 1, isVisited, k)+
ifCounrt(martix, row, col + 1, isVisited, k);
return count;
}
//检查是否符合
public static int check(int row, int col){
int sum = 0;
while(row != 0 || col != 0){
sum += row % 10;
row = row / 10;
sum += col % 10;
col = col / 10;
}
return sum;
}