面試題13. 機器人的運動範圍
解題思路:
和麪試題12的解題思路幾乎一致,利用dfs+回溯,不過這次題目的意思是,要計算所有能夠到達的小格子的個數,而不是最長路徑數,所以沒必要比大小,直接自增就可以了。
源代碼:
class Solution {
private:
vector<vector<int>> dir = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
int maxLen;
bool vis[300][300] = {false};
public:
// 計算每一位之和
int cal(int num1, int num2){
int res = 0;
while(num1 > 0){
res += (num1 % 10);
num1 /= 10;
}
while(num2 > 0){
res += (num2 % 10);
num2 /= 10;
}
return res;
}
void helper(int m, int n, int k, int c_x, int c_y, int index){
int i;
// 在四個方向上去搜索
// 其實看過題解之後發現,
// 不用在四個方向上去找,只找兩個方向,既:下和右就行
vis[c_x][c_y] = true;
for(auto xy : dir){
int x = c_x + xy[0], y = c_y + xy[1];
if(x >= m || x < 0 || y >= n || y < 0 || vis[x][y] || cal(x, y) > k) continue;
else{
// 直接遞增就可以,原來以爲要找最長路徑
// 後來發現題目的意思是,找最大能到達的格子數,
// 也就是連通分量的結點數
maxLen ++;
helper(m, n, k, x, y, index + 1);
}
}
}
int movingCount(int m, int n, int k) {
if(m <= 0 || n <= 0) return 0;
if(k == 0) return 1;
maxLen = 1;
helper(m, n, k, 0, 0, 1);
return maxLen;
}
};