0x01.问题
地上有一个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
输入示例:
m = 2, n = 3, k = 1
输出示例:
3
来自剑指offer
public int movingCount(int m, int n, int k)
0x02.要点分析
初始想往数学方面思考,但是发现并没有合适的方法,所以还是老老实实的搜索。
这本应该是一个BFS类问题,但为了代码的简洁,这里使用DFS。
这是一个非常经典的计数问题,我们只要对格子不断的搜索就行了,注意如下:
- 需要标志数组。
- 只需要去搜索右边和上面就行了,因为是从左上角开始的计数。
代码非常简洁。
0x03.解决代码–DFS
class Solution {
public int digisum(int num){
int ans=0;
while(num>0){
ans+=num%10;
num/=10;
}
return ans;
}
public int movingCount(int m, int n, int k) {
if(k==0) return 1;
boolean[][] visited=new boolean[m][n];
return dfs(0,0,m,n,k,visited);
}
public int dfs(int i,int j,int m,int n,int k, boolean visited[][]){
if(i<0||j<0||i==m||j==n||visited[i][j]) return 0;
if((digisum(i)+digisum(j))>k) return 0;
visited[i][j]=true;
return dfs(i+1,j,m,n,k,visited)+dfs(i,j+1,m,n,k,visited)+1;
}
}
- 时间复杂度:
O(n*m)
- 空间复杂度:
O(n*m)
Leetcode-4.8每日一题打卡完毕!
心情日记:没有值不值得,只有愿不愿意。
ATFWUS --Writing By 2020–04-08