Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 简单的算法,只需要一个棋子就可以从一个棋盘移动到另一个棋盘';s移动_Python_Algorithm_Path Finding - Fatal编程技术网

Python 简单的算法,只需要一个棋子就可以从一个棋盘移动到另一个棋盘';s移动

Python 简单的算法,只需要一个棋子就可以从一个棋盘移动到另一个棋盘';s移动,python,algorithm,path-finding,Python,Algorithm,Path Finding,我有一个问题,如下所示,想找到最快的方式,以获得任何两个点之间只使用一个骑士在国际象棋的举动。我首先想到的是A*算法或Dijkstra的算法,但是我不知道如何确保只使用骑士的招式。如果您能建议一个更好的算法或一些提示来帮助我,我将不胜感激。多谢各位 编写一个名为answer(src,dest)的函数,该函数接受两个参数:开始的源方和结束的方,这是解决难题所需的地方。该函数应返回一个整数,表示使用国际象棋骑士招式从源方格移动到目标方格所需的最小移动次数(即,任意方向上的两个方格后紧跟着垂直于该方向

我有一个问题,如下所示,想找到最快的方式,以获得任何两个点之间只使用一个骑士在国际象棋的举动。我首先想到的是
A*
算法或
Dijkstra的
算法,但是我不知道如何确保只使用骑士的招式。如果您能建议一个更好的算法或一些提示来帮助我,我将不胜感激。多谢各位

编写一个名为answer(src,dest)的函数,该函数接受两个参数:开始的源方和结束的方,这是解决难题所需的地方。该函数应返回一个整数,表示使用国际象棋骑士招式从源方格移动到目标方格所需的最小移动次数(即,任意方向上的两个方格后紧跟着垂直于该方向的一个方格,反之亦然,呈“L”形)。源方格和目标方格都是介于0和63(含0和63)之间的整数,并按照下面的示例棋盘进行编号:

------------------------- | 0| 1| 2| 3| 4| 5| 6| 7| ------------------------- | 8| 9|10|11|12|13|14|15| ------------------------- |16|17|18|19|20|21|22|23| ------------------------- |24|25|26|27|28|29|30|31| ------------------------- |32|33|34|35|36|37|38|39| ------------------------- |40|41|42|43|44|45|46|47| ------------------------- |48|49|50|51|52|53|54|55| ------------------------- |56|57|58|59|60|61|62|63| -------------------------
对于该算法,您需要找到给定节点的所有邻居。使用divmod应该可以很容易地将0-63符号转换为行和列,从而使骑士的移动更容易计算

对于需要查找给定节点的所有邻居的算法。使用divmod可以很容易地将0-63符号转换为行和列,使骑士的移动更容易计算

对于这个问题,只需进行广度优先搜索就足够了(Dijkstra和BFS对未加权图的工作方式相同)。为了确保仅使用国际象棋骑士的招式,您必须以正确的方式定义招式

请注意,国际象棋骑士向任何方向移动两个方块,然后垂直于该方向移动一个方块。这意味着它可以从右向左移动两个正方形,然后向上或向下移动一个正方形,或者向上或向下移动两个正方形,然后向左或向右移动一个正方形


如果您通过行(0-7)和列(0-7)而不是0-63来标识单元格,那么计算会容易得多。这可以通过将单元格索引除以8并使用商和余数作为行和列索引来轻松实现。因此,如果骑士现在处于位置
(x,y)
,其下一个可能的位置可以是
(x-2,y-1),(x-2,y+1),(x+2,y+1),(x-1,y-2),(x-1,y+2),(x+1,y-2),(x+1,y+2)中的任何一个。请注意,这8个单元格可能都不在网格内,因此丢弃掉在板上的位置。

对于这个问题,只需进行广度优先搜索就足够了(Dijkstra和BFS对未加权图的工作方式相同)。为了确保仅使用国际象棋骑士的招式,您必须以正确的方式定义招式

请注意,国际象棋骑士向任何方向移动两个方块,然后垂直于该方向移动一个方块。这意味着它可以从右向左移动两个正方形,然后向上或向下移动一个正方形,或者向上或向下移动两个正方形,然后向左或向右移动一个正方形


如果您通过行(0-7)和列(0-7)而不是0-63来标识单元格,那么计算会容易得多。这可以通过将单元格索引除以8并使用商和余数作为行和列索引来轻松实现。因此,如果骑士现在处于位置
(x,y)
,其下一个可能的位置可以是
(x-2,y-1),(x-2,y+1),(x+2,y+1),(x-1,y-2),(x-1,y+2),(x+1,y-2),(x+1,y+2)中的任何一个。请注意,这8个单元可能都不在网格内,因此丢弃掉在电路板上的位置。

按以下方式解决问题:

步骤1:构建一个图,其中棋盘的每个正方形都是一个顶点

步骤2:当一个骑士从一个正方形移动到另一个正方形时,在顶点之间放置一条边


步骤3:应用Dijkstra算法。Dijkstra算法是一种计算两个顶点(正方形)之间路径长度的算法。

用以下方法解决问题:

步骤1:构建一个图,其中棋盘的每个正方形都是一个顶点

步骤2:当一个骑士从一个正方形移动到另一个正方形时,在顶点之间放置一条边


步骤3:应用Dijkstra算法。Dijkstra算法是一种计算两个顶点(正方形)之间路径长度的算法。

虽然User_Targaryen的答案是最好的,因为它直接回答了您的问题,但如果您的目标是计算在最短时间内给出答案,我建议使用代数解决方案

为了缩短算法,使用X、Y和XY轴的反射,以便只考虑X(y,y),其中x>=y,并将起始移动放在原点,坐标(0, 0)。这是可能方向的八分之一(八分之一)

发现解决方案的一个提示是使用图纸或Dijkstra算法,限制到达第一个八分之一的所有点最多5个移动,并将其显示为网格。网格的每个单元格都应标有一个数字,表示移动的最小次数


如果您想扩大您的问题范围并了解更多信息,请告诉我。

而用户\u Targryen的答案是最好的beca ------------------------- | 0| 1| 2| 3| 4| 5| 6| 7| ------------------------- | 8| 9|10|11|12|13|14|15| ------------------------- |16|17|18|19|20|21|22|23| ------------------------- |24|25|26|27|28|29|30|31| ------------------------- |32|33|34|35|36|37|38|39| ------------------------- |40|41|42|43|44|45|46|47| ------------------------- |48|49|50|51|52|53|54|55| ------------------------- |56|57|58|59|60|61|62|63| -------------------------