我有一个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]]。
我该怎样做才能从那里走动?我想测试所有可能的动作,并返回所有坐标。
答案 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
。