這道題目可以使用回溯的方法來做,但是想來想去應該有更加簡潔的算法,即如下想法:
因爲機器人的可達路徑總是由左至右或者由上至下的方式到達,也就是說,一個地點是否可達,不僅取決於自身座標是否符合要求,而且其左邊或者上邊的地點也要可達,從而可以得到以下結論:visit[i][j] = visit[i-1][j] | visit[i][j-1]; 但是在具體寫代碼的時候要注意到邊界問題。
class Solution {
public:
int movingCount(int m, int n, int k) {
if(k == 0){
return 1;
}
vector<vector<int>> visit(m, vector<int>(n,0));
int res = 1;
visit[0][0] = 1;
for(int i = 0;i < m; ++i){
for(int j = 0;j < n; ++j){
if((i == 0 && j == 0) || (getDigitSum(i) + getDigitSum(j) > k)){
continue;
}
if(i >= 1){
visit[i][j] |= visit[i-1][j];
}
if(j >= 1){
visit[i][j] |= visit[i][j-1];
}
res += visit[i][j];
}
}
return res;
}
int getDigitSum(int n){
int res = 0;
while(n > 0){
res += (n % 10);
n /= 10;
}
return res;
}
};