我似乎找不到解决这个问题的好方法。
假设我在 2D 网格上有一个点描述角色(棋盘游戏)的位置:
[n,m]
现在,在每个回合中,我都可以根据骰子的掷骰(1,2,3...)来移动角色,并且我想找到角色移动的所有可能方式。
移动角色一次意味着仅改变n
或m
,其中对角线移动算作2次移动(即[n+1, m] 移动一次,[n+1,m+1] 移动两次)。
例如,如果我掷出 2,那么所有可能的移动是:
[n,m+2]
[n-1,m+1][n,m+1][n+1,m+1]
[n-2,m][n-1,m][n,m][n+1,m][n+2,m]
[n-1,m-1][n,m-1][n+1,m-1]
[n,m-2]
我似乎无法找到一个明确的算法。
到目前为止,我得到的是 Daniel Lew 的另一个建议。
position = [3,2] #position
n = 2 #number of moves allowed
for i in range(position[0]-n,position[0]+n):
for j in range(position[1]-n,position[1]+n):
if abs(position[0]-i) + abs(position[1]-j) <= n:
print i,j,'works\n'
但是,它错过了 [n][m+2],[n+2,m]
(或者我写的方式错过了它)。
对于简洁的答案或修复有什么建议吗?
最佳答案
假设骰子显示 p。 现在您想知道距离您当前位置有多少个点,曼哈顿距离为 p。 现在你能做的就是简单地这样做。
伪代码:
for i=0..p
if( x+i or x-i is valid and y+p-i or y-p+i is valid )
then move in (x+i,y+p-i) or/and (x-i,y-p+i) or/and (x-i,y+p-i) or/and (x-i,y+-i)
关于algorithm - 确定二维网格上的所有相邻空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41196989/