Python:作为骑士,我如何在numpy数组棋盘中移动?

时间:2016-12-03 19:37:48

标签: python arrays numpy

我有一个numpy数组的代码:

import numpy as np

a = np.array([[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]])

考虑到一个起点,我需要在棋盘上移动这个棋盘(在垂直方向上有2个空格,在水平方向上有1个,反之亦然)。

我可以使用np.argwhere来获取起点的坐标:

np.argwhere(a == 13)返回[[1 5]]。

我该怎样做才能从那里走动?我想测试所有可能的动作,并返回所有坐标。

1 个答案:

答案 0 :(得分:1)

骑士的位置可以用[x y]0 <= x,y < 8来表示。可能的8个运动方向可以由向量[+/-1 +/-2], [+/-2 +/-1]表示。但只有在结果字段有效时,移动才有效(请参阅x,y的上述限制)。此方法无需使用数组即可工作。

使用1维数组的更有效方法如下:在8x8棋盘周围添加宽度为2的边框。这个放大的12x12电路板以1维阵列编码,其中单元值表示相应字段的有效性:

board = [-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
         -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
         -1,-1, 0, 0, 0, 0, 0, 0, 0, 0,-1,-1,
         -1,-1, 0, 0, 0, 0, 0, 0, 0, 0,-1,-1,
         -1,-1, 0, 0, 0, 0, 0, 0, 0, 0,-1,-1,
         -1,-1, 0, 0, 0, 0, 0, 0, 0, 0,-1,-1,
         -1,-1, 0, 0, 0, 0, 0, 0, 0, 0,-1,-1,
         -1,-1, 0, 0, 0, 0, 0, 0, 0, 0,-1,-1,
         -1,-1, 0, 0, 0, 0, 0, 0, 0, 0,-1,-1,
         -1,-1, 0, 0, 0, 0, 0, 0, 0, 0,-1,-1,
         -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
         -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1]

骑士的位置由一个索引(例如左上角为26)和骑士可能通过索引偏移+/-1 + 12*(+/-2)+/-2 + 12*(+/-1)的移动来表示,所以总共{{1 }}。移动的有效性再次由结果索引的有效性检查,该索引减少到25, -23, 23, -25, 14, -10, 10, -14