最近刷剑指offer时碰到一个机器人运动范围的题:
地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?
提示:
1 <= n,m <= 100
0 <= k <= 20
首先我就新建了个excle表格来表示机器人可以到达的格子,发现当k<9的时候,很简单就可以得到答案 。但是这样的方式不具有普适性。
接着读题,我们发现机器人是从(0,0)位置开始走,所有我们只用考虑机器人向下或者向右走的时候是否可以到达。换言之,就是机器人如果可以走到当前格子,那么他的上一个格子或者左一个格子是否是机器人可以到达的格子。
那么我们根据什么来判断我们需要判断的格子是否是机器人可以到达的呢?这个时候我就想到了标记。
然后我们开始写程序(程序配合着注释一起看,更容易理解)
我们先设一个二维数组,m列、n行的二维数组。
int[][] visited=new int[m][n];
然后我们开始通过遍历给这个数组赋值。
for (int i = 0; i < m; i++) {
int a=i;//这儿必须设置一个值等于i,不能用i直接进行计算,否则会导致遍历出错,下面i1同样如此
int x=0;//通过x来计算列的各个位数相加的值
boolean flag=true;//通过标记来跳出while循环,虽然题目给的提示规定了m<=100,但是突破这个限制不麻烦,所以索性就不管它,下面的标记具有同样效果
while (flag){
x=x+a%10;
if(a<10){
flag=false;
}
a=a/10;
}
for (int i1 = 0; i1 < n; i1++) {
int b=i1;
int y=0;
boolean flag1=true;
while (flag1){
y=y+b%10;
if(b<10){
flag1=false;
}
b=b/10;
}