找到一个序列,使得k之间恰好有k个数字

时间:2012-10-15 07:59:38

标签: sequence

我尝试在Google上搜索但无法找到任何相关链接。如果对此问题有任何提及,那就足够了。

2n个数字,每个数字从1到n两次将按顺序排列,使得数字k之间恰好具有k个数字。是否有可能为任何n找到这样的安排? 什么可以是为某些n找到这样的序列的一般策略。

例如,
n = 3 - > 231213个
n = 4 - > 41312432

我发现它们只是通过命中和试验但是找不到n = 5和6。

2 个答案:

答案 0 :(得分:1)

有关详细信息,请参阅此处http://en.wikipedia.org/wiki/Langford_pairing。特别是:“只有当n与0或3模4一致时才存在Langford配对;例如,当n = 1,2或5时,没有Langford配对。”暗示你在n = 5和n = 6时运气不好。

请参阅http://oeis.org/A014552了解给定n的解决方案数量。

答案 1 :(得分:1)

没有任何 n 的序列,因为可以通过穷举搜索 n 2,5或6来轻松验证:

def check(t, n): 
  for i in range(1, n + 1): 
    p1 = t.index(i)
    p2 = t.index(i, p1 + 1)
    if p2 - p1 != i + 1:
      return False
  return True

assert check((2, 3, 1, 2, 1, 3), 3)
assert check((4, 1, 3, 1, 2, 4, 3, 2), 4)

def allseqs(n):
  if n > 1:
    for seq in allseqs(n - 1): 
      for i in range(len(seq) + 1): 
        for j in range(i, len(seq) + 1): 
          yield seq[:i] + (n,) + seq[i:j] + (n,) + seq[j:]
  else:
    if n == 1:
      yield (1, 1)
    else:
      yield ()

def findseqs(n):
  for p in allseqs(n):
    if check(p, n): 
      print p

n = 2,3,4,5:

的结果
>>> findseqs(2)
>>> findseqs(3)
(2, 3, 1, 2, 1, 3)
(3, 1, 2, 1, 3, 2)
>>> findseqs(4)
(2, 3, 4, 2, 1, 3, 1, 4)
(4, 1, 3, 1, 2, 4, 3, 2)
>>> findseqs(5)
>>> findseqs(6)
>>> 

n = 7有很多解决方案,但穷举搜索需要几分钟。