在二维空间中,我们有一组矩形。
这是一张图片:
右边的竖线是不可移动的“墙”。左边的箭头表示运动方向。我需要将最左边的矩形向右移动。
- 矩形不能旋转。
- 矩形不允许水平重叠。
- 矩形可以缩小(水平)到某个最小宽度(每个矩形单独设置)
- 矩形只能水平移动(左/右)和水平收缩。
- 最左边的矩形(箭头所指)不能缩小。
- 宽度和坐标存储为整数。
我需要将最左边的矩形向右移动 X 个单位,将所有东西推到右边。
有两个问题:
- 我需要确定我可以将最左边的矩形向右移动多远(对于 X 个单位可能无法移动)。
- 将 rect 移动 X 个单位(或者如果无法移动 X 个单位,则移动最大可能的量,小于 X)并为系统中的每个矩形获取新的坐标和大小。
其他并发症:
您不能对任何东西使用矩形的 Y 坐标和高度,而是每个矩形都有一个矩形列表(实现为指针),如果您继续向右移动它会碰到它,您只能检索 x 坐标、宽度和最小宽度。此数据模型无法更改。(从技术上讲,将其表示为 2d 中的一组矩形是简化的)
重要提示:来自不同级别和分支的子项可以在“潜在冲突”列表中具有相同的矩形。这是指针显示为红线的初始图片:
我该怎么做?
我知道解决这个问题的一种愚蠢的方法(这会起作用):迭代。IE
- 记住系统的当前状态。如果系统的状态已经被记忆,忘记之前记忆的状态。
- 将最左边的矩形推 1 个单位。
- 递归解决冲突(如果有)。
- 如果冲突无法解决,则返回系统的记忆状态。
- 如果可以解决冲突,并且我们已经移动了 X 个单位,则返回系统的当前状态。
- 否则,转到 1。
这将解决问题,但如果 X 很大,这种迭代解决方案可能会很慢。有没有更好的方法来解决它?