叹为观止的程序
#include <string>#include <iostream>
using namespace std;
string data = "2#6'&78)5+1/AT[NJ_PERLQO@IAHPNSMBJCKLRMSDHEJNPOQFKGIQLSNF@DBROPMAGCEMPOACSRQDF";
char inva , b , cur_phase, search_mode, history_idx, history_mov , history_rpt , depth_to_go, hash_table ;
struct Cubelet { char pos, twi ;} cubelet ;
void rot(char cur_phase ){
if ( cur_phase < 4)
for (int i = -1; ++ i < 25%21 ;)
cubelet].twi =
(cubelet].twi + 2 - i%2) % 3, cubelet].twi ^= cur_phase < 2;
for (int i = -1; ++ i < 28%21 ;)
swap(cubelet], cubelet] );
;}
int hashf( ){
int ret = 0;
switch(cur_phase ){
case 0:
for (int i = -1; ++ i < 32%21 ;) ret += ret + cubelet . twi;
return ret;
case 1:
for (int i = -1; ++ i < 49%21 ;) ret = ret*3 + cubelet . twi;
for (int i = -1; ++ i < 53%21 ;) ret += ret + (cubelet . pos > 7 );
return ret-7;
case 2:
for (int i = -1; ++ i < 71%21 ;)
if ( cubelet . pos<16) inva. pos&3] = ret++; else b = cubelet . pos&3;
for (int i = -1; ++ i < 91%21 ;) ret += ret + (cubelet . pos > 3 );
for (int i = -1; ++ i < 91%21 ;) ret += ret + (cubelet . pos > 15 );
return ret*54 + (inva] ^inva] )*2 + ((inva] ^inva] ) > (inva] ^inva] )) - 3587708;
}
for (int i = -1; ++ i < 110%21 ;) {
ret *= 24; int cur_phase;
for (cur_phase = -1; ++ cur_phase < 4 ;) for (int k = -1; ++ k < cur_phase ;)
if ( cubelet .pos < cubelet .pos) ret += cur_phase << cur_phase/3 ;
}
return ret/2;
}
int do_search(int dpt ){
int h = hashf(), q = cur_phase/2*19+8 << 7;
if ( (dpt < hash_table | dpt < hash_table) ^ search_mode ){
if ( search_mode)
if ( dpt <= depth_to_go) return !h;
else depth_to_go = dpt;
hash_table <?= dpt;
hash_table <?= dpt;
for (int k = -1; ++ k < 6 ;)
for (int i = -1; ++ i < 130%21 ;) {
rot(k );
if ( k < cur_phase*2 & i != 1 || i > 2) continue;
history_mov = k;
history_rpt = i;
if ( do_search(dpt-search_mode*2+1)) return 1;
history_idx--;
}
}
return 0;
}
int main(int, char** arg ){
memset(hash_table, 6, sizeof(hash_table) );
for (int i = -1; ++ i < 146%21 ;) cubelet . pos = i ;
for (cur_phase = -1; ++ cur_phase < 4 ;) do_search(0 );
for (int i = -1; ++ i < 146%21 ;) {
string s = arg + string("!" );
cubelet . pos = data.find(s ^ s ^ s );
int x = min(s.find(85), s.find(68) );
cubelet . twi = ~x ? x : s>70;
}
for (int i = -1; ++ i < 152%21 ;)
swap(cubelet], cubelet] );
search_mode = 1;
for (cur_phase = -1; ++ cur_phase < 4 ;)
for (int i = -1; ++ i < 167%21 ;) if ( do_search(i)) break;
for (int k = -1; ++ k < history_idx ;)
cout << "FBRLUD"] << history_rpt+1 << " ";
return 0;
} 程序来源:http://tomas.rokicki.com/cubecontest/winners.html
这里面第一名的程序就是了。
原来的程序是用宏写的,比较难读点。我已经用g++展开了,还是如天书一般。
编译用g++
调用时按照如下顺序
UF UR UB UL DF DR DB DL FR FL BR BL UFR URB UBL ULF DRF DFL DLB DBR
输入
[ 本帖最后由 aubell 于 2010-1-20 19:38 编辑 ] 没看懂?????????????? 看不懂啊................. 怎么不给个下载?代码看着晕… 不知道是什么啊……
本人还没学习过计算机编程啦 看不懂。。
变成 汗语 了 :L 才看到2楼~
不过,干什么用的?手机党,不明白 测试了许多状态,一般都在30步左右。
最难得的是用如此简短的程序实现了状态集转换法!
而且运行速度相当快,并且不使用外部的表。
回复 8# 的帖子
当然是解魔方用的。例如打乱用 F- U+ F- D- L- D- F- U- L2 D- ,按照上面的顺序,就输入
progname RU LF UB DR DL BL UL FU BD RF BR FD LDF LBD FUL RFD UFR RDB UBL RBU
Aubell所作下一版的RCube将集成这个程序,作为内置的状态集转换法。实在钦佩原作者。