博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【leetcode】688. Knight Probability in Chessboard
阅读量:7100 次
发布时间:2019-06-28

本文共 2143 字,大约阅读时间需要 7 分钟。

题目如下:

On an NxN chessboard, a knight starts at the r-th row and c-th column and attempts to make exactly K moves. The rows and columns are 0 indexed, so the top-left square is (0, 0), and the bottom-right square is (N-1, N-1).

A chess knight has 8 possible moves it can make, as illustrated below. Each move is two squares in a cardinal direction, then one square in an orthogonal direction.

 

 

Each time the knight is to move, it chooses one of eight possible moves uniformly at random (even if the piece would go off the chessboard) and moves there.

The knight continues moving until it has made exactly K moves or has moved off the chessboard. Return the probability that the knight remains on the board after it has stopped moving.

 

Example:

Input: 3, 2, 0, 0Output: 0.0625Explanation: There are two moves (to (1,2), (2,1)) that will keep the knight on the board.From each of those positions, there are also two moves that will keep the knight on the board.The total probability the knight stays on the board is 0.0625.

 

Note:

  • N will be between 1 and 25.
  • K will be between 0 and 100.
  • The knight always initially starts on the board.

解题思路:本题和 非常相似,都是动态规划的方法。最大的不同在于本题有八个方向。主要代码几乎完全复用。

代码如下:

class Solution(object):    def knightProbability(self, N, K, r, c):        """        :type N: int        :type K: int        :type r: int        :type c: int        :rtype: float        """        dp = []        for i in range(K+1):            tl = []            for j in range(N):                tl.append([0] * N)            dp.append(tl)        dp[0][r][c] = 1        direction = [(-2,1),(-1,2),(1,2),(2,1),(2,-1),(1,-2),(-1,-2),(-2,-1)]        count = 0        for x in range(1,len(dp)):            for y in range(len(dp[x])):                for z in range(len(dp[x][y])):                    for (ny, nz) in direction:                        if (y + ny) >= 0 and (y + ny) < N and (z + nz) >= 0 and (z + nz) < N:                            dp[x][y][z] += dp[x - 1][y + ny][z + nz]        for i in (dp[-1]):            for j in i:                count += j        return float(count) / float(pow(8,K))

 

转载于:https://www.cnblogs.com/seyjs/p/10029357.html

你可能感兴趣的文章
EF中Json序列化对象时检测到循环引用的解决办法
查看>>
词向量概况
查看>>
css3 画圆记录
查看>>
javascript中级
查看>>
《CLR Via C# 第3版》笔记之(十五) - 接口
查看>>
golang实现ios推送
查看>>
【Linux】linux常用基本命令
查看>>
libsvm使用说明
查看>>
CodeForces 595A Vitaly and Night
查看>>
秒杀读后感2
查看>>
插入排序
查看>>
Session机制详解
查看>>
【转】使用PHP导入和导出CSV文件
查看>>
面向对象概念思想再理解 2.0
查看>>
VS code 格式化插件, 仅需一步, 无须配置
查看>>
EL表达式的一些知识
查看>>
web 中的认证方式
查看>>
node模块之path——path.join和path.resolve的区别
查看>>
SDNU 1292.圣诞老人
查看>>
BZOJ 3629 约数和定理+搜索
查看>>