劍指Offer 面試題13. 機器人的運動範圍

面試題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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章