您的位置:首页 > Web前端

剑指offer-66题 机器人的运动范围

2017-10-28 12:43 525 查看
题目:

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

思路:

此题的思路和上一道题很像,都用到了DFS,因此可以使用递归来实现。当机器人运动到一个可行的点后需要将计数器的值加一,之后分别在左、右、上、下进行搜索。搜索到符合条件的点则计数器(rcount)的值加一,不符合条件则返回0.

解题代码:

public class Solution {
/**
*
* @method Desc:计算出机器人走过的格子数
* @date 2017-10-28上午8:42:09
*/
public int movingCount(int threshold, int rows, int cols){
if(rows == 0 || cols == 0)
return 0;
//构建访问矩阵
boolean [][]visited = new boolean [rows][cols];
for(int i=0;i<rows;i++){
Arrays.fill(visited[i], false);
}

//计算走过的方格的个数
return Availability(threshold, rows, cols, 0, 0, 0, visited);
}

//查找走过的路径
public int Availability(int threshold, int rows, int cols,int i,int j,int count,boolean [][]visited){
int rcount = count;
if(i>=rows || i<0){
return rcount;
}
if(j>=cols || j<0){
return rcount;
}
if(visited[i][j]){
return rcount;
}
int x = i, y = j;
//计算坐标和
int sum = 0;
while(i != 0){
sum += i%10;
i/= 10;
}
while(j != 0){
sum += j%10;
j/= 10;
}
if(sum <= threshold){
visited[x][y] = true;
rcount = 1 + Availability(threshold,rows,cols,x,y+1,rcount,visited)
+Availability(threshold,rows,cols,x,y-1,rcount,visited)
+Availability(threshold,rows,cols,x+1,y,rcount,visited)
+Availability(threshold,rows,cols,x-1,y,rcount,visited);
}else{
return rcount;
}
return rcount;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: