|
|
1
3
假设工件P在位置X,Y,并且可以将N个正方形移到位置X2,Y2。这意味着(x-x2)和(y-y2)之间的绝对差之和不能大于n。 如果你要显示哪些方块可以移动(而不是接受输入x2和y2),我认为最好是在一个方块中的所有位置上绕一圈。那是…
这个答案假设棋子只能移动到相邻的正方形,而不能对角移动。 编辑:如果你想要对角线移动,沿着对角线移动的成本和水平或垂直移动的成本一样多,那么问题实际上要容易得多——工件P可以在(x-n,x+n)和(y-n,y+n)之间移动。 如果对角移动的成本没有水平+垂直移动的成本高(例如,如果对角移动的成本为1.5,而H/V的成本为1),那么答案就变得更加复杂。 |
|
|
2
2
一般来说,这些问题涉及到一个可以到达的合理有限的区域网格。采用网格大小的数据结构,其元素能够以足够的精度保存剩余移动点的数量。 将网格初始化为未访问的值。这不得在零到最大可能移动速度的范围内。负值是理想值。 将起始位置初始化为剩余移动数。 此时,有三种可能的方法: 1)每一步重新扫描整个网格。简单但较慢。终止是指没有任何一点产生合法的行动。 2)将点存储在堆栈上。比1快,但仍然不是最好的。当堆栈为空时终止。 3)将点存储在队列中。这是最好的。当队列为空时终止。
请注意,使用基于堆栈的方法,您总是会遇到一些情况,最终会抛出旧的计算并再次执行它们。只有在某些情况下,绕过坏地形比穿过坏地形便宜时,才会采用基于队列的方法。 仅在循环结束时检查终止条件,否则在ObtainPoint尝试使用空队列或堆栈时终止。ObtainPoint之后的空队列/堆栈 不是 意思是你完了! (请注意,这是对伊恩答案的相当大的扩展。) |
|
|
3
1
这纯粹是在概念层面上的,但请尝试以下逻辑:
我可能没有解释清楚,如果你对我想说的有任何疑问,请告诉我。 |
|
|
4
0
您可以使用上面的方法,但使用递归。 递归“深度”是移动距离。 深度移动时中断。 每次迭代都应该返回一个空间向量并添加自己的位置。 删除重复项 |