两个剪枝:
1.因为转动过程会出现循环,所以要限制深度
2.因为重复状态没有意义,所以可以记录状态,防止重复搜索
然后模拟+搜索轻松过了
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
int a[7] , b[7];
void rotate1 ( )
{
int t1 = a[4] , t2 = a[3] , t3 = a[1] , t4 =a[2];
a[1] = t1 , a[2] = t2 , a[3] = t3 , a[4] = t4;
}
void rotate2 ( )
{
int t1 = a[3] , t2 = a[4] , t3 = a[2] , t4 = a[1];
a[1] = t1 , a[2] =t2 , a[3] = t3 , a[4] = t4;
}
void rotate3 ( )
{
int t1 = a[6] , t2 = a[5] , t5 = a[1] , t6 = a[2];
a[1] = t1 , a[2] = t2 , a[5]= t5 , a[6] = t6;
}
void rotate4 ( )
{
int t1 = a[5] , t2 = a[6] , t5 = a[2] , t6 = a[1];
a[1] = t1 , a[2] = t2 , a[5] = t5 , a[6] = t6;
}
int ans = 50;
int used[5];
bool vis[5][5][5][5];
bool check ( )
{
for ( int i = 1 ; i <= 6 ; i++ )
if ( a[i] != b[i] ) return false;
return true;
}
void back ( int c[] )
{
for ( int i = 1 ; i <= 6 ; i++ )
a[i] = c[i];
}
void dfs ( int n = 0 )
{
if ( check ( ) )
{
ans = min ( ans , n );
return;
}
if ( vis[used[1]][used[2]][used[3]][used[4]] ) return;
else vis[used[1]][used[2]][used[3]][used[4]] = 1;
int c[7];
for ( int i = 1 ; i <= 6 ; i++ ) c[i] = a[i];
if ( used[1] < 3 )
{
used[1]++;
rotate1 ( );
dfs ( n+1);
back ( c );
used[1]--;
}
if ( used[2] < 3 )
{
used[2]++;
rotate2 ( );
dfs ( n+1 );
back ( c );
used[2]--;
}
if ( used[3] < 3 )
{
used[3]++;
rotate3 ( );
dfs ( n+1 );
back ( c );
used[3]--;
}
if ( used[4] < 3 )
{
used[4]++;
rotate4 ( );
dfs ( n+1 );
back ( c );
used[4]--;
}
}
int main ( )
{
while ( ~scanf ( "%d" , &a[1] ) )
{
ans = 50;
memset ( used , 0 , sizeof ( used ) );
memset ( vis , 0 , sizeof ( vis ) );
for ( int i = 2 ; i <= 6 ; i++ ) scanf ( "%d" , &a[i] );
for ( int i = 1 ; i <= 6 ; i++ ) scanf ( "%d" , &b[i] );
dfs ( );
if ( ans == 50 ) puts ( "-1" );
else printf ( "%d\n" , ans );
}
}