1. 程式人生 > >leetcode 935 Knight Dialer

leetcode 935 Knight Dialer

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