我正在尝试使用算法来执行以下操作:
在程序停止之前,我需要填充12个单元格。我有3行,每行有4列。
举个例子,让我在飞机上说明这一点。所以你有3行,每行有4列,你有窗口/过道座位。每排都有一个靠窗的座位,过道座位,过道座位和靠窗座位(| WA AW |就像飞机上的座位布置一样)。在每次迭代(不同的乘客组),将有一些乘客(1到12之间),我需要将它们最靠近在一起(座位在一起)。我为下一组(每次迭代)执行此操作,直到程序停止(当我完成每个组时它将停止)。
例如,我有3名乘客(A,B和C),而A想要坐在窗口,B想要坐在Aisle,C想要坐在Window。假设所有座位(全部12个)都可用,我可以将它们放置为| A#BC |或者| CB #A |并标记座位脏(所以我不会为下一位乘客再次选择相同的座位)。我为下一组(迭代)做这个。 我不确定这个论坛是否正确,但如果有人能告诉我应该如何完成,我将非常感激 感谢。
答案 0 :(得分:2)
如果输入有序,并且假设座位数始终为12
,则每个州(乘客组)只能2^12
个座位。您可以使用它来减少暴力/记忆解决方案的状态数。
伪代码:
IsSeatingPossible( mask, passengers ) =
if ( no more passengers ) return true
return IsSeatingPossible =
new_mask = mask + brute force on passenger constraints
if any IsSeatingPossible( new_mask,
passengers - just processed passengers )
更多解释:
掩码基本上是12个布尔值的数组,说明是否为每个i采用了seat_i(您可以轻松转换2D (x,y)
- > 1D (x)
)。然后你迭代可能性。如果这套乘客(A_1, A_2, .., A_k)
各有一个座位,其他乘客都有座位,则可以设置完整的座位。
因此,用英语传递的面具是所采取的座位。因此,假设您将座位(A_1, A_2, .., A_k)
放在座位(x_1, x_2, .., x_k)
中。乘客可以坐在一些子集中 - 以N choose k
为界,在这种情况下很小。这是你蛮力的部分。给定一个特定的(x_1, x_2, .., x_k)
,如果(x_1, x_2, .., x_k)
与当前面具没有重叠(基本上没有冲突的座位),并且可以处理其余的乘客请求,则可以进行此座位,新掩码,它只是当前掩码和(x_1, x_2, .., x_k)
的设置添加。 (采取新的座位。)
这可能或者可能不够快。整洁的事情是注意到,除了注意到哪个座位被采取,以及乘客被处理了什么,解决方案对于某个子问题是相同的。因此,您可以使用memoization轻松加快速度。这会产生O(N 2^N)
空间解决方案。
最好使用位掩码实现掩码,尤其是N = 12
,因此名称。对于乘客请求列表,您可能只需要跟踪哪个索引。
答案 1 :(得分:1)
如果它真的只有12个单元格,而且组的大小是事先知道的,那么动态编程很可能是合适的。计算每组占用座位(2 ^ 12)和每个k(0 <= k <= 12)是否可以适当地放置第一组k以准确占据该组座位。 (作为优化,k由集合的大小决定。)最后,向后工作:如果我将最后一组放在这里,我可以将剩余的座位中的其他组合作吗?等等。
答案 2 :(得分:1)
这是Knapsack problem类型的一个实例,其中包含以前已知的解决方案。