您的位置:首页 > Web前端

剑指offer:机器人的运动范围

2018-03-24 18:57 507 查看
题目:
地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?

思路:
一开始的思路是回溯法,后来发现这道题每个格子只要走过一遍了就好了,不需要回溯,下面是实现代码:
1. 新建一个visited矩阵记录格子是否被访问过了。
2. 如果遍历到的一个格子没访问过,标记为置为1. public int movingCount(int threshold, int rows, int cols)
{
boolean[] visited = new boolean[rows*cols];
return backtracing(0, 0, threshold, rows, cols, visited);
}
public static int backtracing(int i, int j, int threshold, int rows, int cols, boolean[] visited){
int count = 0;
int index = i*cols + j;
if(i>=0 && i<rows && j>=0 && j<cols && visited[index]==false && judge(i,j,threshold)) {
visited[index] = true;
count = 1+ backtracing(i - 1, j, threshold, rows, cols, visited)
+backtracing(i + 1, j, threshold, rows, cols, visited)
+backtracing(i, j - 1, threshold, rows, cols, visited)
+backtracing(i, j + 1, threshold, rows, cols, visited);
}
return count;
}
public static boolean judge(int i, int j,int threshold){ //判断i,j是否满足条件
int sum = 0;
while(i>0){
sum += i%10;
i /= 10;
}
while(j>0){
sum += j%10;
j /= 10;
}
return sum<=threshold;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: