我正在做一个基于平铺的游戏。我尝试创建一个方法,返回一个我的角色可以根据x,y坐标和移动限制移动的数组。
例如,如果我输入currentPosition:(3,3)moveLimit:1
然后它应该给我回来((3,2),(3,2),(3,4),(4,3))
如果我输入currentPosition:(3,3)moveLimit:2
那么它应该回((3,1),(2,2),(3,2),(4,2),(1,3),(2,3),(4,3), (5,3),(2,4),(3,4),(4,4),(3,5))
我计划通过在x和y上使所有可能的-1和+1来使用递归方法。但这是非常低效的,因为可能会发生很多重复的情况,比如+1然后-1比-1然后+1。
任何人都知道这有什么好的模式吗?
非常感谢你。
答案 0 :(得分:1)
让我们首先定义问题以及您正在寻找的内容:
将k
表示为距离,将(x,y)
表示为原点(来源)。
f((x,y),k) = { (a,b) | abs(x-a) + abs(y-b) <= k }
这意味着,一个包含所有点(a,b)的集合:abs(x-a) + abs(y-b) <= k
(这是距离限制)
现在,要获得所有相关元素,您可以这样做:
moves((x,y),k):
for i=0 to k+1: //number of steps in the x axis, some number between 0 to k inclusive
//number of steps in the y axis, some number between 0 to k-i inclusive:
for j=0 to k-i+1:
if (x-i,y-j) is in range: output (x-i,y-j)
if (x+i,y-j) is in range: output (x+i,y-j)
if (x-i,y+j) is in range: output (x-i,y+j)
if (x+i,y+j) is in range: output (x+i,y+j)
注意:
abs(a-x) + abs(b-x) <= k
答案 1 :(得分:0)
尝试从元素(向上,向左,向下,向右)计算长度“moveLimit”的所有组合。
E.g。
UUU
UUL
UUD
UUR
ULL
ULD
ULR
UDD
UDR
URR
LLL
...
这应该已经减少了很多计算次数。您仍然可能会得到导致相同位置的不同移动组合。