我正在开发一个自动修剪脚趾甲的机器的软件,这样用户就可以简单地把脚放进去然后运行它,而不必通过咬脚趾甲或者使用指甲钳来手动修剪脚趾甲。
我们的潜在用户基础中很大一部分可能是犹太人,而且显然,有一个按顺序排列的 不修脚趾甲的传统(or fingernails)
对于这一传统的确切应用似乎存在不同意见书,但我们认为以下规则足以适应那些宗教习俗禁止为了修剪脚趾甲而修剪脚趾甲的人:
这就是我们决定给脚趾编号的方法:
5 4 3 2 1 1 2 3 4 5
Left foot Right foot
我已经写了代码来解决这个问题,但是所使用的算法是次优的: 事实上,最差的情况下性能是 O (∞)。它的工作方式类似于 博格索特。下面是实际代码的伪代码简化:
function GenerateRandomSequence
sequence = Array[5]
foreach (item in sequence)
item = RandomNumberBetween(1,5)
return sequence
function GetToenailCuttingOrder
while (true)
sequence = GenerateRandomSequence()
if (!AllItemsAreUnique(sequence))
continue
if (NoTwoAdjacentItemsHaveConsecutiveNumbers(sequence))
return sequence
do
leftFootSequence = GetToenailCuttingOrder()
rightFootSequence = GetToenailCuttingOrder()
until (leftFootSequence != rightFootSequence &&
leftFootSequence != leftFootSequenceFromLastRun &&
rightFootSequence != rightFootSequenceFromLastRun)
基本上,它生成随机序列并检查它们是否满足条件。如果不符合标准,就重新开始。这并不需要很长的时间,但是它是非常不可预测的。
我意识到我现在做事的方式非常糟糕,但是我很难想出一个更好的方法。你们有谁能提出一个更优雅更高效的算法吗?