今天在一次考试中,我得到了一道算法题,题中给出了棋盘的N*M大小,我应该确定骑士从棋盘的左下边缘到右上边缘所能做的最小移动次数。怎么能做到呢?
你可以使用BFS或DFS模拟骑士的移动。我个人更喜欢DFS方法,因为它可以递归实现。如果您有一个函数process
,它将当前x位置、当前y位置、表格的行、表格的列和计数器作为参数,那么解决方案如下所示:
/* .......... */
process(x-1, y-2, R, C, count+1);
process(x+1, y-2, R, C, count+1);
process(x-2, y-1, R, C, count+1);
process(x-2, y+1, R, C, count+1);
process(x-1, y+2, R, C, count+1);
process(x+1, y+2, R, C, count+1);
process(x+2, y-1, R, C, count+1);
process(x+2, y+1, R, C, count+1);
/* .......... */
到达目的地后,返回当前的count值。
编辑:也可以使用动态规划来解决。你把dp(i,j)定义为到达正方形(i,j)的最佳方式。所以dp(i,j)等于:
dp(i,j) = min{dp(all squares that can reach (i,j) in one move)} + 1
我相信你可以把这减少到三种情况:
>
你有一个没有解决方案的板示例:2w*4h
你有一块1:2w*3h的电路板
你有一个正方形的电路板,因此有一个4:3w*3h的解决方案
如果您有一个比这些大的棋盘,您可以通过将一次移动的endpoint设置为更大棋盘的起点来将其缩小到其中之一。
示例:尺寸为4w*5h的板:
_ _ _ _
_ _ _ _
_ e _ _
_ _ _ _
s _ _ _
其中s是开始,e是结束。
从这里开始,将其缩小为方形板:
_ 1 e
3 _ _
s _ 2
需要4步才能到达终点。所以对于这个尺寸,你有1 4步=5步。
我希望这足以让你开始。
编辑:这似乎并不完美。然而,它展示了一种解决这个问题的启发式方法。下面是另一个让你享受观看乐趣的例子:
_ _ _ e
_ 3 _ _
_ _ _ _
_ _ 2 _
_ _ _ _
_ 1 _ _
_ _ _ _
s _ _ _
在4x8板上有4个动作直到结束。
通过编程lanugage,可以更好地解决这个问题,方法是首先从当前位置映射所有可能的移动,并查看它们是否匹配终点。如果他们没有,检查你的问题是否是你以前解决过的更简单的问题。正如一位评论人士所指出的那样,这是通过备忘录实现的。
然而,如果你用手做这件事,我敢打赌,你可以像我已经开始做的那样,通过将它隔离成少量的案例来解决它。
使用BFS和备忘录的解决方案:
# Memoization
memo = a matrix of NOVISITED of size N x M
# Starting position
# (row, column, jumps)
queue.push((0, 0, 0))
while queue is not empty:
# Get next not visited position
row, column, jumps = queue.pop()
# Mark as visited
memo[row][column] = jumps
for each possible move (nrow, ncolumn) from (row, column):
if memo[nrow][ncolumn] is NOVISITED:
# Queue next possible move
queue.append((nrow, ncolumn, jumps + 1))
NOVISITED
可以有值-1
或null
,如果我们将可能的距离视为非负数[0, inf)
。
在memo[row][column]
中,每个方块的最小跳转次数将是可接受的,因此从左下角开始的右上角的答案将位于memo[N-1][M-1]
。
更新
请注意,如果矩阵是正方形nxn
,则可以应用对称原则。
我在这里使用jsPlumb的演示: 在此演示中,无法将现有连接移动到不同的目标节点。知道怎么做吗? 其他一些示例具有可移动的连接,但它们也使用节点上的特定endpoint。我喜欢这个特定的示例,其中我可以将连接终结点拖动到目标节点的任何点。
我试图实现一个带有alpha beta修剪的国际象棋游戏。以下几乎可以工作,但它返回错误的动作。 例如,可以出现以下情况。 白色(用户)移动,白色国王位置-a1/黑色(计算机),黑色国王位置-h1 白色从a1-a2移动其国王,然后黑色返回移动g2-g1??? 计算机似乎返回了错误节点的移动(电路板表示),就好像给定电路板位置的最佳评估没有一直传播到树的后面。因此,在探索的一个模拟位置中,计算机“想
还有人发现谷歌地图(现在)允许你平移到两极之外有问题吗?它曾经停在两极,对吗? 每次用户平移或缩放地图时,我正在工作的一个站点都会在我们的服务器上执行基于位置的查询。这会导致错误,因为用户从地图边缘平移触发的查询是荒谬的。 现在,可以说,我正在服务器端处理edge案例,但在客户端这不是一个很好的用户体验。有没有人有防止过度平移的解决方案? 谢谢
TBD 参考 The Birth of an Edge Orchestrator – Cloudify Meets Edge Computing K8s(Kubernetes) and SDN for Multi-access Edge Computing deployment
本文向大家介绍java绘制五子棋棋盘,包括了java绘制五子棋棋盘的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了java绘制五子棋棋盘的具体代码,供大家参考,具体内容如下 源码: 效果图: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。
本文向大家介绍c# 绘制中国象棋棋盘与棋子,包括了c# 绘制中国象棋棋盘与棋子的使用技巧和注意事项,需要的朋友参考一下 本文是利用C# 实现中国象棋的棋盘绘制,以及初始化布局,并不实现中国象棋的对弈逻辑。仅供学习参考使用。 思路: 绘制中国象棋棋盘,竖线九条,横线十条。再中间绘制‘楚河',‘汉界' 。 绘制棋子,然后将棋子布局在棋盘上即可。 涉及知识点: 用户控件:用于实现棋盘的绘制,重写 OnP