京东2019春招算法工程师笔试题-牛牛下象棋(编程题3)
? ? ? ?這次京東2019的春招算法工程師筆試時間是2018-04-09 19:00~21:00,其中有三道編程題目,當時就做了2個,后一個時間原因就沒做,就截了一個圖,今天又突然看到了,練練手吧哈。
題目要求:
最近牛牛開始向犇犇老師學習下中國象棋了。犇犇老師告訴他,象棋中的“馬”走日字型,如下圖,紅色表示馬能調到的位置。
以棋盤左下角為原點,向上為y軸正方向,向右為x軸正方向,建立坐標系。牛牛想知道,棋盤左下角的馬,經過K次移動之后,落在坐標系 (X, Y) 的情況有多少種。當任意一次移動后馬的位置不同時,兩種情況被認為不同。
因為答案可能很大,請輸出情況數取模1000000007的結果。
輸入描述:
輸入K,一個正整數,表示移動的步數(K<=100000)
輸入X, Y表示坐標且X(0<=X<=8), Y(0<=Y<=8)
題目分析:
?動態規劃解法:
令 f[r][c][steps]表示, 經過steps步之后落在棋盤(r, c) 上的次數。則dp遞推方程如下:?
?f[r][c][steps]= ∑ f[ri+dr][cj+dc][steps?1]? (注意前面有個累計符號哦)
(1)解釋,dr, dc 表示steps-1 ---->?steps步的偏量,且r = ri+dr,c = cj+dc,也就是,只要在steps-1的步驟中,所有可能的位置到達steps步驟中的(r, c),的次數總和,就是steps步驟中(r, c)的次數。
(2)最后,只要取出在最后一步棋盤上位置上的次數就可以了。
(3)現在看看優化問題,很顯然,在每一個steps步驟中,只需要當前步驟steps的數據,和前一個steps-1的數據,就可以完成計算,所以f[r][c][steps] 這個3維數組,完全可以用兩個2維數組代替。?所以用,dp2表示 f[][][steps],用dp表示f[][][steps-1]。
(4)仔細看看輸入描述,你會發現它明明要是的X(0<=X<=8), Y(0<=Y<=8)它讓我想到了國際象棋,其實這個題目是LeetCode:688. Knight Probability in Chessboadr的一個變種。
Python3實現:
# 京東2019的春招算法工程師筆試時間是2018-04-09 19:00~21:00-編程題3 # @Time :2018/5/13 # @Author :LiuYinxing # 解題思路: 動態規劃 # 時間復雜度 O(N^2K) 空間復雜度 O(N^2)class Solution:def knightNumber(self, K, x, y):dp = [[0] * 9 for _ in range(10)] # 初始化dpdp[0][0] = 1for _ in range(K):dp2 = [[0] * 9 for _ in range(10)] # 初始化當前dpfor r in range(10):for c in range(9):for dr, dc in zip((2, 2, -2, -2, 1, 1, -1, -1), (1, -1, 1, -1, 2, -2, 2, -2)): # 八個方向if 0 <= r + dr < 10 and 0 <= c + dc < 9: # 判斷是否出界dp2[r+dr][c+dc] += dp[r][c]dp = dp2return dp[y][x] % 1000000007 # 取模if __name__ == '__main__':solu = Solution()print(solu.knightNumber(4, 3, 3))發現問題,記得留言指教哦
總結
以上是生活随笔為你收集整理的京东2019春招算法工程师笔试题-牛牛下象棋(编程题3)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: “试图执行的操作不受支持”解决
- 下一篇: arduino MP3 音乐播放器