思路:由题意可以看出,类似于二维的迷宫问题。首先想到使用二维矩阵 递归与回溯的方法解题。测试用例(k,m,n小于0) 需要有一个boolean数组来记录是否走过,count数来记录走过多少个格子。判断是否满足的代码实现方式比较多样,计算两个数各位的相加 我想到转换为字符串长度判断位数,循环相加即可。还可以使用 整除 取余等于0 两个命令或运算。两个都为0说明这个数为0,否则不为0 继续循环计算即可。
由于需要计算路径格子的总数,所以没有终止条件,一直往前走。判断完返回false 回溯,继续进入下一个情况的格子。
误区:我最开始使用循环遍历 来进行位数的判断。这种方法是不行的,如果是行列两个数相加可以。但是每一位相加就有可能路径被截断过不去了,所以计算出的数偏高,错误。
class Solution {
boolean[][] bool;
int count=0;
public int movingCount(int m, int n, int k) {
if(k<0 || m<0 || n<0){
return 0;
}
bool=new boolean[m][n];
move(m,n,k,0,0);
return count;
}
public boolean move(int m, int n, int k,int row,int list){
if(!isOk(m,n,k,row,list)){
return false;
}
bool[row][list]=true;
count++;
if(move(m,n,k,row+1,list)||move(m,n,k,row-1,list)||move(m,n,k,row,list+1)||move(m,n,k,row,list+1)||move(m,n,k,row,list-1)){
}
return false;
}
public boolean isOk(int m, int n,int k,int row,int list){
if(row<0 || row>=m || list<0 || list>=n || bool[row][list]==true){
return false;
}
int rows=0;
int lists=0;
while(row/10!=0 || row%10!=0){
rows+=row%10;
row=row/10;
}
while(list/10!=0 || list%10!=0){
lists+=list%10;
list=list/10;
}
if(lists+rows>k){
return false;
}
return true;
}
}