/* ID: yinguan1 TASK: msquare LANG: C++ */ #include <iostream> using namespace std; #define _max_state_ 40320 #define _vis_mask_ 0x char vis[1<<21] ; int source, target, queue[_max_state_] ; int trans[3][8]={ {7, 6, 5, 4, 3, 2, 1, 0}, {3, 0, 1, 2, 5, 6, 7, 4}, {0, 6, 1, 3, 4, 2, 5, 7} } ; void get_trace( int state, int level ) { if( state == source ){ cout << level << endl ; return ; } int pre=0 ; for( int j=0; j<8; j++ ) pre |= ( ( state >> (j*3) ) & 0x7 ) << ( 3*trans[ vis[state>>3]-'A' ][j] ) ; get_trace( pre, level+1 ); cout << vis[state>>3] ; } int main() { freopen("msquare.in", "r", stdin); freopen("msquare.out", "w", stdout); for( int i=0, val=0 ; i<8; i++ ){ cin >> val ; source |= i<<(3*i), target |= (--val)<<(3*i) ; } int *head=queue, *tail=queue ; *(tail++) = source; do { register int cur= *(head++) ; if( cur==target ) { get_trace( target, 0 ); cout << endl ; return 0 ; } for( int i=0; i<3; i++ ){ register int next=0 ; for( int j=0; j<8; j++ ) next |= ( ( cur >> (trans[i][j]*3) ) & 0x7 ) << (3*j) ; if( vis[next>>3] ) continue ; vis[next>>3] = 'A' + i, *(tail++) = next ; } } while ( head != tail ); return 0; }