Java 卡片魔术,定购卡片的算法

Java 卡片魔术,定购卡片的算法,java,algorithm,math,Java,Algorithm,Math,我已经研究这个问题很长时间了,问题如下: 考虑一下下面的“魔术”。你有一副n张牌,标为1,2,…,n,但不一定按那个顺序排列。 然后重复以下过程,直到没有剩余卡: 向公众展示卡组顶部的卡,并将其从卡组中移除 从牌组顶部取出下一张牌,将其放置在牌组底部,但不显示。 您的目标是事先订购牌组中的牌,以便向公众显示的牌的顺序是递增的:1、2、…、n 例如:如果n=5,则从排列1,5,2,4,3开始工作: 1,5,2,4,3->2,4,3,5->3,5,4->4,5->5 问题:编写一个算法,为任意给定数

我已经研究这个问题很长时间了,问题如下:

考虑一下下面的“魔术”。你有一副n张牌,标为1,2,…,n,但不一定按那个顺序排列。 然后重复以下过程,直到没有剩余卡:

向公众展示卡组顶部的卡,并将其从卡组中移除 从牌组顶部取出下一张牌,将其放置在牌组底部,但不显示。 您的目标是事先订购牌组中的牌,以便向公众显示的牌的顺序是递增的:1、2、…、n

例如:如果n=5,则从排列1,5,2,4,3开始工作: 1,5,2,4,3->2,4,3,5->3,5,4->4,5->5

问题:编写一个算法,为任意给定数量的n张卡打印适当的初始顺序

排序算法 输入:整数n 输出:打印正确的卡片顺序

我设法得到了以下结果:

n=1 --> 1
n=2 --> 1,2
n=3 --> 1,3,2
n=4 --> 1,3,2,4
n=5 --> 1,5,2,4,3
n=6 --> 1,4,2,6,3,5
n=7 --> 1,6,2,5,3,7,4
n=8 --> 1,5,2,7,3,6,4,8
正如你所看到的,每隔一个数字就有一个模式,比如1,x,2,x,4,x。。。 我也相信,根据n值是偶数还是奇数,算法会有所不同,但我不太确定如何计算。如果n为偶数,则第二个元素=值n-2+1


任何建议都将不胜感激

在使用魔术或编写基于约化的生成器或基于生成规则的约化器时,千万不要遵守游戏规则:你知道你想要的最终顺序,所以通过反向运行技巧生成开始序列。将所有牌视为可见,将最后一张牌放在空牌组的顶部,将其从底部移动到顶部。当然,这不会改变最后一张牌的顺序,然后将下一张牌放在顶部。重复,直到完成

那么,让我们从您想要的最终订单开始。比如说,1,2,3,4,5。然后:

完成了

如果我们用1,2,3,4,5,6,7,8,9,10来计算,我们可以用10个步骤得到1,6,2,10,3,7,4,9,5,8

还请注意,此算法处于启用状态:对于1000张卡的序列,我们执行1000次从下到上移动,然后在顶部步骤中添加卡。我们能改进一下吗?可能,但这需要看更长的序列,看看我们是否能找到它产生的排列模式


我们知道这是非常规则的,所以可能需要改进-例如,序列1,2,…,n-1,n我们可以立即完全确定牌组中的奇数牌:1,2,…,n/2在1..5序列中,数字是1,x,2,x,3,对于1..10我们看到1,x,2,x,3,x,4,x,5,x。如果我们能弄清楚其余的数字是如何排列的,我们可能会找到一个O1算法,用于立即生成要开始的数据组序列。不过,这稍微超出了这个答案的范围。

从空白卡片开始,在每个ie上写下索引:顶部的得到0,下一个得到1,依此类推。表演这个把戏,每次你向公众展示一张卡片时,在上面写下你想让他们看到的号码

下面是实现这一点的代码。卡片存储卡片的原始索引,并像技巧规则一样进行操作。值存储写入每个索引卡的数字。技巧完成后,值存储技巧工作所需的数字

这不是Java,但算法如下:

def order(n):
    cards = range(n)
    values = [None] * n
    for i in xrange(1, n+1):
        values[cards.pop(0)] = i
        if cards:
            cards.insert(len(cards)-1, cards.pop(0))
    return values

for n in xrange(1, 9):
    print 'n=%d --> %s' % (n, ','.join(map(str, order(n))))
输出:

n=1 --> 1
n=2 --> 1,2
n=3 --> 1,3,2
n=4 --> 1,3,2,4
n=5 --> 1,5,2,4,3
n=6 --> 1,4,2,6,3,5
n=7 --> 1,6,2,5,3,7,4
n=8 --> 1,5,2,7,3,6,4,8

代码比原来的魔术更神奇

问问题的Wall of Text TM方法很少得到有用的回答。如果一个段落长度超过3行,几乎不可能阅读。一、 首先,别麻烦了……你在什么地方出错了吗?15432按照14235.yep的顺序生产卡片,用于从上到下移动,而不是按本应的方式从下到上移动。更新了答案。
n=1 --> 1
n=2 --> 1,2
n=3 --> 1,3,2
n=4 --> 1,3,2,4
n=5 --> 1,5,2,4,3
n=6 --> 1,4,2,6,3,5
n=7 --> 1,6,2,5,3,7,4
n=8 --> 1,5,2,7,3,6,4,8