先放代碼,演算法設計過程我隨後再放上去
//author:1025679612@qq.com
//csdn:http://blog.csdn.net/wind_2008_06_29/article/details/7706531
#include <iostream>#include <list>using std::cout;using std::endl;using std::cin;using std::list;boolbVisitTag[387420489]={false};//9^9用來表示其中的一種狀態是否被訪問過//=========================================================================//begin classPointdefine//=========================================================================classPoint{public:Point();Point(constPoint&rhs);public:booloperator==(constPoint&rhs);booloperator!=(constPoint&rhs);Point&operator= (constPoint&rhs);public:intm_iRow;//intm_iCol;};Point::Point(){}Point::Point(constPoint&rhs){m_iRow=rhs.m_iRow;m_iCol=rhs.m_iCol;}boolPoint::operator!=(constPoint&rhs){return!operator==(rhs);}boolPoint::operator==(constPoint&rhs){return(m_iRow==rhs.m_iRow)&&(m_iCol== rhs.m_iCol);}Point&Point::operator= (constPoint&rhs){m_iRow=rhs.m_iRow;m_iCol=rhs.m_iCol;return*this;}//=========================================================================//end of classPointdefine//=========================================================================//=========================================================================//begin classCStatedefine//=========================================================================class CState{//儲存9宮的狀態public:CState(constCState&rhs);CState();public:CState&operator=(constCState&rhs);booloperator==(constCState&rhs);public:intvValue[3][3];Pointm_Center;//我們設0的位置是Center};CState::CState(const CState& rhs):m_Center(rhs.m_Center){for(int iRow= 0; iRow< 3; ++iRow){for(int iCol= 0; iCol< 3; ++iCol)vValue[iRow][iCol]=rhs.vValue[iRow][iCol];}}CState::CState(){}CState&CState::operator= (constCState&rhs){m_Center=rhs.m_Center;for(int iRow= 0; iRow< 3; ++iRow){for(int iCol= 0; iCol< 3; ++iCol)vValue[iRow][iCol]=rhs.vValue[iRow][iCol];}return*this;}boolCState::operator==(constCState&rhs){if(m_Center !=rhs.m_Center)returnfalse;for(int iRow= 0; iRow< 3; ++iRow){for(int iCol= 0; iCol< 3; ++iCol)if(vValue[iRow][iCol]!=rhs.vValue[iRow][iCol])returnfalse;}returntrue;}//=========================================================================//end of classCStatedefine//========================================================================= CStateStateBegin, StateEnd;//開始和結束狀態intSearch();intStateToInt(constCState&state);//編碼CStateIntToState(intiState); //解碼intmain(){for(intiRow=0; iRow< 3; ++iRow){for(intiCol= 0; iCol< 3; ++iCol){cin>>StateBegin.vValue[iRow][iCol];if(StateBegin.vValue[iRow][iCol]== 0){StateBegin.m_Center.m_iRow=iRow;StateBegin.m_Center.m_iCol=iCol;}}}for(intiRow=0; iRow< 3; ++iRow){for(intiCol= 0; iCol< 3; ++iCol){cin>>StateEnd.vValue[iRow][iCol];if(StateEnd.vValue[iRow][iCol]== 0){StateEnd.m_Center.m_iRow=iRow;StateEnd.m_Center.m_iCol=iCol;}}}cout<<Search()<<endl;}intStateToInt(constCState&state){//編碼intiValue=0;for(intiRow=2; iRow>= 0; --iRow){for(intiCol=2; iCol>= 0; --iCol){iValue*= 9;iValue+= state.vValue[iRow][iCol];}}returniValue;}CStateIntToState(intiState){ //解碼CStatestate;for(intiRow= 0; iRow< 3; ++iRow){for(intiCol= 0; iCol< 3; ++iCol){state.vValue[iRow][iCol]=iState%9;iState/= 9;if(state.vValue[iRow][iCol]== 0){state.m_Center.m_iRow=iRow;state.m_Center.m_iCol=iCol;}}}returnstate;}//=========================================================================//BFS search//========================================================================= intSearch(){list<CState>buffer1, buffer2;intiStep= 0;list<CState>*lpListUsed;//存放當前這一步list<CState>*lpListNextStep;//存放下一步if(StateBegin==StateEnd)return0;//直接到達的話就是0了lpListUsed=&buffer1;lpListNextStep=&buffer2;lpListUsed->push_back(StateBegin);intiPosition=StateToInt(StateBegin);bVisitTag[iPosition]=true;//bVisitTag[StateToInt(StateBegin)]=true;//打標記while(!lpListUsed->empty()){CStateStateNow;CStateStateNext;++iStep;while(!lpListUsed->empty()){StateNow=lpListUsed->front();lpListUsed->pop_front();if(StateNow==StateEnd){returniStep-1;}if(StateNow.m_Center.m_iRow-1>= 0){StateNext=StateNow;--StateNext.m_Center.m_iRow;StateNext.vValue[StateNow.m_Center.m_iRow][StateNow.m_Center.m_iCol]=StateNow.vValue[StateNext.m_Center.m_iRow][StateNext.m_Center.m_iCol];StateNext.vValue[StateNext.m_Center.m_iRow][StateNext.m_Center.m_iCol]=0;intiPosition=StateToInt(StateNext);if(!bVisitTag[iPosition]){bVisitTag[iPosition]=true;lpListNextStep->push_back(StateNext);}}if(StateNow.m_Center.m_iRow+1< 3){StateNext=StateNow;++StateNext.m_Center.m_iRow;StateNext.vValue[StateNow.m_Center.m_iRow][StateNow.m_Center.m_iCol]=StateNow.vValue[StateNext.m_Center.m_iRow][StateNext.m_Center.m_iCol];StateNext.vValue[StateNext.m_Center.m_iRow][StateNext.m_Center.m_iCol]=0;intiPosition=StateToInt(StateNext);if(!bVisitTag[iPosition]){bVisitTag[iPosition]=true;lpListNextStep->push_back(StateNext);}}if(StateNow.m_Center.m_iCol-1>= 0){StateNext=StateNow;--StateNext.m_Center.m_iCol;StateNext.vValue[StateNow.m_Center.m_iRow][StateNow.m_Center.m_iCol]=StateNow.vValue[StateNext.m_Center.m_iRow][StateNext.m_Center.m_iCol];StateNext.vValue[StateNext.m_Center.m_iRow][StateNext.m_Center.m_iCol]=0;intiPosition=StateToInt(StateNext);if(!bVisitTag[iPosition]){bVisitTag[iPosition]=true;lpListNextStep->push_back(StateNext);}}if(StateNow.m_Center.m_iCol+1< 3){StateNext=StateNow;++StateNext.m_Center.m_iCol;StateNext.vValue[StateNow.m_Center.m_iRow][StateNow.m_Center.m_iCol]=StateNow.vValue[StateNext.m_Center.m_iRow][StateNext.m_Center.m_iCol];StateNext.vValue[StateNext.m_Center.m_iRow][StateNext.m_Center.m_iCol]=0;intiPosition=StateToInt(StateNext);if(!bVisitTag[iPosition]){bVisitTag[iPosition]=true;lpListNextStep->push_back(StateNext);}}}std::swap(lpListUsed, lpListNextStep);}return-1;}