骑士拨号器-c++解题思路

  1. 骑士拨号器-c++解题思路

1.暴力法

思路:每一个号码,是由上面一轮的某个或者某几个号码,通过跳“日”得到的。
代码:
#include
#include
#include

using namespace std;

//骑士跳“日”
long M = 1e9 + 7;
int knightDialer(int N) {
    //N等于1,即只有一步时
    if(N == 1){
        return 10;
    }

    //存储最终结果的vetor
    vector<long> dp1(10, 1);

    int step = 1;
    while(step<N){

        //dp2记录中间结果,dp2[i] 可以由dp1[j]、dp1[k]等得到
        vector<long> dp2(10, 0);
        dp2[1] = (dp1[6] + dp1[8])%M;
        dp2[2] = (dp1[7] + dp1[9])%M;
        dp2[3] = (dp1[4] + dp1[8])%M;
        dp2[4] = ((dp1[0] + dp1[3])%M + dp1[9])%M;
        dp2[6] = ((dp1[0] + dp1[1])%M + dp1[7])%M;
        dp2[7] = (dp1[2] + dp1[6])%M;
        dp2[8] = (dp1[1] + dp1[3])%M;
        dp2[9] = (dp1[2] + dp1[4])%M;
        dp2[0] = (dp1[4] + dp1[6])%M;
        dp1 = dp2;
        step++;
    }

    int result = 0;
    for(int i=0;i<dp1.size();i++){
        if(dp1[i] != 0){
            result = (result + dp1[i])%M;
        }
    }
    return result;
}

int main(){
    int resultValue = knightDialer(161);
    cout<<resultValue<<endl;
    return 0;
}
结果

骑士拨号器-c++解题思路_第1张图片

可优化的点
将dp2放到while循环之外,可以减少多次创建相同的vector,节省空间和加快运行速度。

你可能感兴趣的:(leetcode刷题)