這一次,我們將 「騎士」 放在**撥號盤的任意數字鍵(如上圖所示)上,接下來,騎士將會跳 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 位數字。你能用這種...