将一个数字(0-9)添加到序列/字符串会创建新的4位数字

时间:2012-07-03 19:32:39

标签: combinations puzzle digits

我试图找到一个能够打破安全的算法"通过键入0-9键。代码长4位。安全性将打开,它将代码标识为键入的子字符串。意思是,如果代码是" 3456"所以下一次打字会打开保险箱:" 123456"。 (这只意味着保险箱没有重新启动每4个键输入)。

是否存在一种算法,每次向序列添加一位数时,它会创建新的4位数字(序列\字符串的最后4位数的新组合)?

谢谢,km。

编辑(我几年前发布): 问题是如何确保每次我将输入(一位数)设置到保险箱时,我会生成一个之前未生成的新的4位数代码。例如,如果保险箱获得3位数的二进制代码,那么这应该是我的输入序列:

0001011100 

因为对于每个输入,我得到一个新的代码(3位长),这个代码之前没有生成:

000 -> 000
1 -> 001
0 -> 010
1 -> 101
1 -> 011
1 -> 111
0 -> 110
0 -> 100

3 个答案:

答案 0 :(得分:2)

我发现你的问题减少了:

让我们用以下方式定义有向图G =(V,E):

V = {所有可能的代码组合}。

E = {<你,v> | v可以通过添加1位数字(在结尾处)从u获得,并删除第一位数字。

| V | = 10 ^ 4.

每个顶点的Din和Dout等于10 => | E | = 10 ^ 5.

你需要证明G中存在汉密尔顿循环 - 如果你这样做,你可以证明存在一个解决方案。

<强> EDIT1:

算法:

  1. 如上所述构建有向图G.

  2. 计算汉密尔顿周期 - {v1,v2,..,vn-1,v1}。

  3. 按v1中的每个数字。

  4. X&lt; - v1。

  5. 保险箱未打开时
  6. 5.1 X&lt; - X后的Hamilton路径中的下一个顶点。

    5.2按下X中的最后一位数字。

  7. 我们可以看到,因为我们使用Hamilton循环,所以我们永远不会重复相同的子串。 (最后4次按下)。

    <强> EDIT2:

    当然汉密尔顿路径已经足够了。

答案 1 :(得分:1)

总结一下,我认为你试图解决的问题以及我如何解决问题的一些解释。 http://www.cs.swan.ac.uk/~csharold/cpp/SPAEcpp.pdf

你必须做一些事情才能使它适合中国邮政人员问题但是...... 想象一下,为二进制数字,三位数字符串解决这个问题。假设您有前两位数字,并问自己有什么选择可以转移到? (关于下两位数字符串?) 你留下了一个有向图。

 /-\
/   V    
\-  00 ----> 01
      ^  /   ^|
       \/    ||
       /\    ||
      V  \   |V
 /-- 11 ---> 10 
 \   ^         
  \-/

解决中国邮递员,你将拥有所有组合,并将形成一个字符串     现在的问题是,中国邮递员是否可以解决?有一些算法可以确定天气是否可以为CPP解决DAG,但我不知道这个特定的图是否必须必须基于单独的问题解决。这将是一件好事。然而,你确实知道你可以找到算法天气它是可以解决的,如果是你可以使用该论文中提供的算法(我认为)和在线解决它。

此处的每个顶点都有2个传入边和2个传出边。 有4(2 ^ 2)个顶点。

在完整大小的问题中,有19683( 3 ^ 9 )个顶点,每个顶点都有512 ( 2 ^ 9 )输出和输入顶点。总共有

19683( 3 ^ 9 ) x 512 (2 ^ 9) = 10077696 edges in your graph. 

解决方法:

1.) Create list of all 3 digit numbers 000 to 999.
2.) Create edges for all numbers such that last two digits of first number match first
two digits of next number. 

ie 123 -> 238 (valid edge) 123 -> 128 (invalid edge)

3.) use Chinese Postman solving algorithmic approaches to discover if solvable and
solve

答案 2 :(得分:0)

我会创建一个子序列数组,需要在插入新数字时进行更新。因此,在您的示例中,它将以:

开头
array = {1}

然后

array = {1,2,12}

然后

array = {1,2,12,3,13,23,123}

然后

array = {1,2,12,3,13,23,123,4,14,24,124,34,134,234,1234}

当你有一个已经长度为4的序列时,你不需要继续连接,只需删除序列的第一个数字并在末尾插入新数字,例如,使用最后一个项目1234,当我们添加5时,它将变为2345,如下所示:

array = {1,2,12,3,13,23,123,4,14,24,124,34,134,234,1234,5,15,25,125,35,135,235,1235,45,145,245,1245,345,1345,2345,2345}

我认为这不是一种非常复杂的方法来覆盖给定序列的所有子序列。