下面程序可以得到解,但不是最优解,如果要最优解,需要多加一层运算
#include "stdafx.h"
#include <fstream>
#include <iostream>
#include <string>
#include <list>
#include <hash_set>
using namespace std ;
using namespace stdext ;
class A {
public:
int CURR[3] ; //代表3个容器中的多少
int TOT[3] ; //代表3个容器的含量
A() {
TOT[0] = 12 ;
TOT[1] = 8 ;
TOT[2] = 5 ;
CURR[0] = 12 ;
CURR[1] = 0 ;
CURR[2] = 0 ;
}
bool succ( ) {
if ( CURR[0] == 6 )
return true ;
else
return false ;
}
int hash_value( ) {
return CURR[0] * 1000 + CURR[1] * 10 + CURR[2] ;
}
//将oldPos中的导入到newPos中去
A ATOB( int oldPos , int newPos ) {
A newA ;
newA.CURR[0] = CURR[0] ;
newA.CURR[1] = CURR[1] ;
newA.CURR[2] = CURR[2] ;
if ( newA.CURR[oldPos] == 0 || newA.CURR[ newPos ] == newA.TOT[newPos] ) {
return newA ;
}
if ( newA.CURR[oldPos] + newA.CURR[newPos] > newA.TOT[newPos] ) {
newA.CURR[oldPos] = newA.CURR[oldPos] + newA.CURR[newPos] - newA.TOT[newPos] ;
newA.CURR[newPos] = newA.TOT[ newPos ] ;
} else {
newA.CURR[newPos] = newA.CURR[oldPos] + newA.CURR[newPos] ;
newA.CURR[oldPos] = 0 ;
}
return newA ;
}
};
bool operator== ( A a , A b ) {
return a.hash_value() == b.hash_value() ;
}
void calc( ) {
A a ;
list<A> ls ;
list<A> change ; //结果
hash_set<int> hs ;
ls.push_back( a ) ;
while( ls.size() > 0 ) {
A& last = ls.back() ;
if ( hs.find(last.hash_value() ) != hs.end() ) {
ls.pop_back() ;
change.remove( last ) ;
continue ;
} else {
hs.insert( last.hash_value() ) ;
change.push_back( last ) ;
for( int i = 0 ; i <= 2 ; i ++ ) {
for ( int j = 0 ; j <= 2 ; j ++ ) {
if ( i != j ) {
A ch = last.ATOB( i , j ) ;
if ( ch.succ() ) {
change.push_back( ch ) ;
list<A>::const_iterator iter = change.begin() ;
for( ; iter != change.end() ; iter++ ) {
fprintf( stdout , "%d %d %d\n" , (*iter).CURR[0] , (*iter).CURR[1] , (*iter).CURR[2] ) ;
}
return ;
}
if ( ch == last ||
hs.find( ch.hash_value() ) != hs.end() ) {
continue ;
} else {
ls.push_back( ch ) ;
continue ;
}
}
}
}
}
}
}
_tmain()
{
calc() ;
int a ;
cin >> a ;
}