谁能帮我看懂这段代码
int permtonum(char* p){int n=0;
for ( int a=0; a<4; a++) {
n*=4-a;
for( int b=a; ++b<4; )
if (p<p) n++;
}
return n;
}
// convert number in range 0..23 to permutation of 4 chars.
void numtoperm(char* p,int n,int o){
p+=o;
p=o;
for (int a=3; a--;){
p = n%(4-a) +o;
n/=4-a;
for (int b=a; ++b<4; )
if ( p >= p) p++;
}
}
// get index of cube position from table t
int getposition(int t){
int i=-1,n=0;
switch(t){
// case 0 does nothing so returns 0
case 1://edgeflip
// 12 bits, set bit if edge is flipped
for(;++i<12;) n+= ori<<i;
break;
case 2://cornertwist
// get base 3 number of 8 digits - each digit is corner twist
for(i=20;--i>11;) n=n*3+ori;
break;
case 3://middle edge choice
// 12 bits, set bit if edge belongs in Um middle slice
for(;++i<12;) n+= (pos&8)?(1<<i):0;
break;
case 4://ud slice choice
// 8 bits, set bit if UD edge belongs in Fm middle slice
for(;++i<8;) n+= (pos&4)?(1<<i):0;
break;
case 5://tetrad choice, twist and parity
int corn,j,k,l,corn2;
// 8 bits, set bit if corner belongs in second tetrad.
// also separate pieces for twist/parity determination
k=j=0;
for(;++i<8;)
if((l=pos-12)&4){
corn=k++;
n+=1<<i;
}else corn=l;
//Find permutation of second tetrad after solving first
for(i=0;i<4;i++) corn2=corn];
//Solve one piece of second tetrad
for(;--i;) corn2^=corn2;
// encode parity/tetrad twist
n=n*6+corn2*2-2;
if(corn2<corn2)n++;
break;
case 6://two edge and one corner orbit, permutation
n=permtonum(pos)*576+permtonum(pos+4)*24+permtonum(pos+12);
break;
case 7://one edge and one corner orbit, permutation
n=permtonum(pos+8)*24+permtonum(pos+16);
break;
}
return n;
}
// sets cube to any position which has index n in table t
void setposition(int t, int n){
int i=0,j=12,k=0;
char *corn="QRSTQRTSQSRTQTRSQSTRQTSR";
reset();
switch(t){
// case 0 does nothing so leaves cube solved
case 1://edgeflip
for(;i<12;i++,n>>=1) ori=n&1;
break;
case 2://cornertwist
for(i=12;i<20;i++,n/=3) ori=n%3;
break;
case 3://middle edge choice
for(;i<12;i++,n>>=1) pos= 8*n&8;
break;
case 4://ud slice choice
for(;i<8;i++,n>>=1) pos= 4*n&4;
break;
case 5://tetrad choice,parity,twist
corn+=n%6*4;
n/=6;
for(;i<8;i++,n>>=1)
pos= n&1 ? corn-CHAROFFSET : j++;
break;
case 6://slice permutations
numtoperm(pos,n%24,12);n/=24;
numtoperm(pos,n%24,4); n/=24;
numtoperm(pos,n ,0);
break;
case 7://corner permutations
numtoperm(pos,n/24,8);
numtoperm(pos,n%24,16);
break;
}
}
页:
[1]