leetcode 935 Knight Dialer
阿新 • • 發佈:2018-11-20
leetcode 935 Knight Dialer
1.題目描述
國際象棋中的騎士可以按下圖所示進行移動:
這一次,我們將 “騎士” 放在電話撥號盤的任意數字鍵(如上圖所示)上,接下來,騎士將會跳 N-1 步。每一步必須是從一個數字鍵跳到另一個數字鍵。
每當它落在一個鍵上(包括騎士的初始位置),都會撥出鍵所對應的數字,總共按下 N 位數字。
你能用這種方式撥出多少個不同的號碼?
因為答案可能很大,所以輸出答案模 10^9 + 7。
示例 1:
輸入:1
輸出:10
示例 2:
輸入:2
輸出:20
示例 3:
輸入:3
輸出:46
範圍:
1 <= N <= 5000
2.解題思路
想到DP,每多一步的電話數字與上一步的電話數字相關。
用phone
來儲存每個數字下一步可能走上的數字,res
表示某一步數將走上其索引所在數字的所有情況的總數,new
用來更新其總數情況。
3.Python程式碼
class Solution:
def knightDialer(self, N):
"""
:type N: int
:rtype: int
"""
if N == 1: return 10
mod = 10**9 + 7
phone = [[]] * 10
phone[0] = [4,6]
phone[1] = [6,8]
phone[2] = [7,9]
phone[3] = [4,8]
phone[4] = [3,9,0]
phone[5] = []
phone[6] = [1,7,0]
phone[7] = [2,6]
phone[8] = [1,3]
phone[9] = [2,4]
res = [1] * 10
for i in range(N-1):
new = [0] * 10
for number in range(10):
for j in phone[number]:
new[j] += res[number]
res = new
return sum(res) % mod