1.第一个文件 SAMPLE.BAT
给出了一行命令
kcube U:WWRYOOGBY D:BWROROYYR F:WGORWBOGG B:WRORBBWOR L:YWOYYGBBG R:BGGRGYBWY
从这个命令行能看出什么呢? U D F B L R,显然是六个面,
每个面以后跟9个字母,BOY一类都有,RGB也有,w是白的,那么就是颜色;可每个面九个
贴纸按照怎样的顺序输入呢?
大概作者会说明的,多半在README中吧?
2.README.TXT
打开来瞧瞧,介绍了作者Greg Schmidt为什么要写这个程序,也是为了
深入理解Kociemba的算法,同我们的目的一样,在 Mike Reid 的建议
下开始写的。最后还有他的联系方式。
还列出了完整的文件包括哪些,防止残缺。
中间有一句“Please see cubemain.cpp for instructions on how to
invoke this program”,让我们到cubemain.cpp中找如何用这个程序。
但给出的文件没有cubemain.cpp,大约疏忽了,那就猜哪个是主调文件吧。
找同kcube.exe同名的cpp就是了,因为写程序,难免会疏忽,何况写帮助。
3.kcube.cpp
果然是主调程序,main函数就在这里面。命令行程序通常只有一个入口,
通常都是main。
这里的注释给了个展开图:
//For example, consider the following "unfolded"
// cube:
// Red Red Wht
// Yel Wht Wht
// Wht Red Red
//
// Wht Wht Grn Org Yel Yel Blu Red Org Yel Grn Grn
// Red Org Org Yel Yel Yel Blu Red Org Blu Grn Blu
// Yel Wht Grn Org Wht Org Yel Blu Blu Red Grn Red
//
// Blu Org Blu
// Grn Blu Grn
// Wht Org Grn
//
// With the faces above corresponding to:
//
// Up
// Left Front Right Back
// Down
//
// Then one possible way to enter this configuration is:
//
// >cube L:WWGROOYWG R:BROBROYBB U:RRWYWWWRR D:BOBGBGWOG
// F:OYYYYYOWO B:YGGBGBRGR
这个图很重要,有了这个图,就知道输入的顺序了,是展开图的顺序。
而且,不标准的配色应该也可以。
但真的在输入的时候,也不会很轻松,搞反前后左右的事情很常见,弄错弄丢一
两片贴纸也很常见,这是命令行程序的缺点;就算用图形界面的CubeExplorer,
有时都会输入错误。而且,等它给出答案,你还要在魔方是试试,看对不对... ...
真佩服早期玩电脑的朋友,在DOS下,内存没多大,界面没图形,
那时的解魔方的程序是怎样写的呢?怎样玩的呢?
魔方难,程序难,魔方程序就更难了。
魔方好玩,程序好玩,魔方程序就更好玩了。
言归正传。
main函数里出现了四个类的对象,
代码中,检查Parity的一段最精彩。没有读过这段代码的朋友,可以试想一下:
你会怎样检查呢?
代码中的方法很朴实,但很有效。一般还想不到,很难想到。
我以前的程序,检查的时候竟然先编了一个盲拧的编码,然后看编码是否正确。冤。
作者的用这个方法很好,值得我们学习。
看过以后,就知道是怎么实现的。隐约知道是正确的。但为什么正确,就讲不清楚了。
请何方高人讲透彻一些?为什么排列中,元素向后两两比较的结果可以用来计算是否有Parity?
关键段落:
// Permutation parity can be computed by counting the number of
// reversals in the permutation sequence, - i.e., the number
// of pairs (p,q) such that p>q and p precedes q. Then
// determine if the result is even or odd. Do this for both
// edges (EPP) and corners (CPP). A configuration is reachable
// if EPP=CPP. (August/September cube.lovers - Vanderschel/Saxe)
int FaceletCube:: PermutationParity(int* permutations, int numberOfCubies)
{
int p, q;
int permutationParity = 0;
for (p = 0; p < numberOfCubies-1; p++)
{
for (q = p+1; q < numberOfCubies; q++)
{
if (permutations[p] > permutations[q])
permutationParity++;
}
}
return permutationParity%2;
}