我正在尝试编写我的第一个算法,这是我假设要使用的伪代码。该算法假设为 k 个点置换集合 {0,1,2,3,4,5,6,7,8,9}。例如 n= 设置 0-9 所以 n=10 和 r=kn^r 排列
所以 U={0,1,2,3,4,5,6,7,8,9} (单链表)
S 最初是空的,让 k=2。该集合应该有 10^2 个排列。按照伪代码一步一步..
1)“从U中删除e”和“添加到S的末尾”
U={1,2,3,4,5,6,7,8,9}
S={0}
2) 然后它再次执行“PuzzleSolve(k-1,S,U)”,因为 k!= 1
U={2,3,4,5,6,7,8,9}
现在 S={0,1} 和 k =1,因此它检查解决方案。假设它没有找到解决方案.. 1 返回 U 并从 S 中删除。
现在:
U ={2,3,4,5,6,7,8,9,1}
S ={0}
所以这会不断重复,直到 U 中的所有数字都与 0 匹配,因为第一行中的 for 循环。但是我的问题是,如何从 S 的末尾删除 e?我想让 S 成为一个链表,但我认为不可能从单链表的末尾删除一个链接。我应该为 S 使用什么数据结构?
Algorithm PuzzleSolve(k,S,U):
Input: Integer k, sequence S, and set U (universe of elements to test)
Output: Enumeration of all k-length extensions to S using elements in U without repetitions
**for** all e in U **do**
Remove e from U {e is now being used}
Add e to the end of S
**if** k = 1 **then**
Test whether S is a configuration that solves the puzzle
**if** S solves the puzzle **then**
**return** “Solution found: ” S
**else**
PuzzleSolve(k - 1, S,U)
Add e back to U {e is now unused}
Remove e from the end of S