每日刷題 騎士撥號器

2021-09-08 23:43:00 字數 1698 閱讀 6804

這一次,我們將 「騎士」 放在**撥號盤的任意數字鍵(如上圖所示)上,接下來,騎士將會跳 n-1 步。每一步必須是從乙個數字鍵跳到另乙個數字鍵。

每當它落在乙個鍵上(包括騎士的初始位置),都會呼出鍵所對應的數字,總共按下 n 位數字。

你能用這種方式呼出多少個不同的號碼?

因為答案可能很大,所以輸出答案模 10^9 + 7。

示例 1:

輸入:1

輸出:10

示例 2:

輸入:2

輸出:20

示例 3:

輸入:3

輸出:46

解答:先給出一種方法,給出所有可能的排序,再求出所有排序的總數量。

emmm…理論正確,實際完全不可行。

**:

int

knightdialer

(int n)

,//0

,//1

,//2

,//3

,//4

,//5

,//6

,//7

,//8

//9}

;const

int jumpsize[10]

=;int result =0;

for(

int i =

0; i <

10; i++

)int nowsize = record.

size()

;for

(int j =

0; j < nowsize; j++)}

result +

= record.

size()

;}cout<

return result;

}

執行結果:(能通過才怪)

正確解法:上述方法雖然不可行,但是理論是沒有問題的,對於較小的n而言,是完全正確的。我通過上述方法,列出了n=1到n=10之間的所有記錄值,總結出該題的規律:某一位上貢獻的可能性 = 它可能跳到的另外幾位貢獻的可能性之和。

ok,到這裡,如何求最終結果的方法已經找到了。

但是還有乙個問題,由於該結果十分大,記錄其各位上數字的陣列也很有可能溢位,這是需要解決的一點。我們可以通過求餘來解決。

**:

class

solution

;long

long sum[10]

=;long

long result =0;

if( n ==1)

return10;

else

if( n ==2)

return20;

else

}for

(int i =

0; i <

10; i++)}

return result;}}

;

執行結果:

騎士撥號器 c 解題思路

騎士撥號器 c 解題思路 思路 每乙個號碼,是由上面一輪的某個或者某幾個號碼,通過跳 日 得到的。include include include using namespace std 騎士跳 日 long m 1e9 7 intknightdialer int n 儲存最終結果的vetor vec...

935 騎士撥號器 c 解題方法二

思路 將0 9分為四個部分 include include include using namespace std 騎士跳 日 long m 1e9 7 intknightdialer int n vector long dp1 4 有四個數 dp1 0 4 有兩個數 dp1 1 2 有兩個數 dp...

C語言重構 935 騎士撥號器

所有題目源 git位址 題目西洋棋中的騎士可以按下圖所示進行移動 這一次,我們將 騎士 放在 撥號盤的任意數字鍵 如上圖所示 上,接下來,騎士將會跳 n 1 步。每一步必須是從乙個數字鍵跳到另乙個數字鍵。每當它落在乙個鍵上 包括騎士的初始位置 都會呼出鍵所對應的數字,總共按下 n 位數字。你能用這種...