劍指offer-機器人的運動範圍(leetcode)

這道題目可以使用回溯的方法來做,但是想來想去應該有更加簡潔的算法,即如下想法:

因爲機器人的可達路徑總是由左至右或者由上至下的方式到達,也就是說,一個地點是否可達,不僅取決於自身座標是否符合要求,而且其左邊或者上邊的地點也要可達,從而可以得到以下結論: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;
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章