以下是引用ggglgq在6/11/2004 5:19:28 PM的发言:
六、(步长为偶数的)循环变换 [集合] 的构造 1.构造步长为 1 的变换 a ,设 A 为 a ,执行 5 。
2.撤消 上一步 的构造,如果所有步长为 1 的变换都已遍历,则结束
构造循环变换;否则设撤消后的变换为 A ,执行 3 。
3.在 A 的基础上构造下一个 步长加一 的有效变换 A ,执行 4; 若
构造不存在,则执行 2 。
“ 例如:此时 A 为 a b c ... d ”
4.如果 A 不是最少步,则执行 2 。
5.如果 A 不是唯一最少步,即存在另一个与 A 不同的变换 B ,使得
A = B [ B 可能不只一个,有几个就要执行几次 ] ,执行 6 ;否则执行 3 。
6.设 C 为 A (-B) [ 其中:-B 表示 B 的逐元逆变换,
如 B = a b c ,则 -B = (-c) (-b) (-a) ] ,
如果 any(circle0(C),half(C)) 都是最少步变换,则 C 为一个循环
变换,执行 7 ;否则执行 3 。
7.让 循环变换 C 与前面(构造好的)那些循环变换比较是否相同,若
不相同则添加 循环变换 C 并保存这些(新构造的)循环变换;否则不保存
这个循环变换 C 。
8.执行 3 。
现在的问题是魔方最少步最长的变换的长度一般都无法确定,如果确定
某一魔方最长变换的长度为 Max ,便可在 3 判断如果 length(A) >= Max ,
则执行 2 ,缩短程序运行时间。
当然,上面的步骤只是一个最简易的“循环变换 [集合] 构造”的方法,
实际应用还要对以上八步进行优化,比如判断 7 所构造的 循环变换 是否与
前面已(构造好的)循环变换在 旋转、对称 时相同,若相同则不保存这一
循环变换等。 欢迎大家在“循环变换 [集合] 的构造”的问题上进行广泛的探讨。
|