http://acm.hdu.edu.cn/showproblem.php?pid=1195
dfs暴力搜索
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
using namespace std ;
struct node
{
int num[ 4 ] ;
int step ;
};
int visit[ 11 ][ 11 ][ 11 ][ 11 ] ;
void bfs( node str1 , node str2 )
{
int i ;
node st , en ;
queue<node> Q ;
memset( visit , 0 , sizeof( visit ) ) ;
st = str1 ;
st.step = 0 ;
Q.push( st ) ;
visit[ st.num [ 0 ] ] [ st.num[ 1 ] ][ st.num[ 2 ] ][ st.num[ 3 ] ] = 1 ;
int flag ;
while( !Q.empty() )
{
st = Q.front() ;
//cout << st.step << endl ;
Q.pop() ;
flag = 1 ;
for( i = 0 ; i < 4 ; i++ )
{
if( st.num[ i ] != str2.num[ i ] )
{
flag = 0 ;
break ;
}
}
//cout << flag << endl ;
if( flag )
{
cout << st.step << endl ;
return ;
}
for( i = 0 ; i < 4 ; ++i )
{
en = st ;
if( en.num[ i ] == 9 )
en.num[ i ] = 1 ;
else
en.num[ i ] = st.num[ i ] + 1;
if( !visit[ en.num[ 0 ] ][ en.num[ 1 ] ][ en.num[ 2 ] ][ en.num[ 3 ] ] )
{
visit[ en.num[ 0 ] ][ en.num[ 1 ] ][ en.num[ 2 ] ][ en.num[ 3 ] ] = 1 ;
en.step = st.step + 1 ;
Q.push( en ) ;
}
}
for( i = 0 ; i < 4 ; ++i )
{
en = st ;
if( en.num[ i ] == 1 )
en.num[ i ] = 9 ;
else
en.num[ i ] = st.num[ i ] - 1;
if( !visit[ en.num[ 0 ] ][ en.num[ 1 ] ][ en.num[ 2 ] ][ en.num[ 3 ] ] )
{
visit[ en.num[ 0 ] ][ en.num[ 1 ] ][ en.num[ 2 ] ][ en.num[ 3 ] ] = 1 ;
en.step = st.step + 1 ;
Q.push( en ) ;
}
}
for( i = 0 ; i < 3 ; ++i )
{
en = st ;
en.num[ i ] = st.num[ i + 1 ] ;
en.num[ i + 1 ] = st.num[ i ] ;
if( !visit[ en.num[ 0 ] ][ en.num[ 1 ] ][ en.num[ 2 ] ][ en.num[ 3 ] ] )
{
visit[ en.num[ 0 ]][ en.num[ 1 ] ][ en.num[ 2 ] ][ en.num[ 3 ] ] = 1 ;
en.step = st.step + 1 ;
Q.push( en );
}
}
}
}
int main()
{
int n , i ;
node str1 , str2 ;
char str[ 2 ][ 4 ] ;
cin >> n ;
while( n-- )
{
cin >> str[ 0 ] ;
for( i = 0 ; i < 4 ; ++i )
str1.num[ i ] = str[ 0 ][ i ] - '0' ;
cin >> str[ 1 ] ;
for( i = 0 ; i < 4 ; ++i )
str2.num[ i ] = str[ 1 ][ i ] - '0' ;
bfs( str1 , str2 ) ;
}
return 0 ;
}