我试图找到一个能够打破安全的算法"通过键入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
答案 0 :(得分:2)
我发现你的问题减少了:
让我们用以下方式定义有向图G =(V,E):
V = {所有可能的代码组合}。
E = {<你,v> | v可以通过添加1位数字(在结尾处)从u获得,并删除第一位数字。
| V | = 10 ^ 4.
每个顶点的Din和Dout等于10 => | E | = 10 ^ 5.
你需要证明G中存在汉密尔顿循环 - 如果你这样做,你可以证明存在一个解决方案。
<强> EDIT1:强>
算法:
如上所述构建有向图G.
计算汉密尔顿周期 - {v1,v2,..,vn-1,v1}。
按v1中的每个数字。
X&lt; - v1。
:
5.1 X&lt; - X后的Hamilton路径中的下一个顶点。
5.2按下X中的最后一位数字。
我们可以看到,因为我们使用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}
我认为这不是一种非常复杂的方法来覆盖给定序列的所有子序列。