百度之星9宫图算法

先放代码,算法设计过程我随后再放上去

  1. //author:1025679612@qq.com  
  1. //csdn:<a href="http://blog.csdn.net/wind_2008_06_29/article/details/7706531">http://blog.csdn.net/wind_2008_06_29/article/details/7706531</a>  
  1. #include <iostream>  
  2. #include <list>  
  3. using std::cout;  
  4. using std::endl;  
  5. using std::cin;  
  6. using std::list;  
  7.   
  8. bool    bVisitTag[387420489]=   {false};    //9^9用来表示其中的一种状态是否被访问过  
  9.   
  10. //=========================================================================  
  11. //begin class   Point   define  
  12. //=========================================================================  
  13. class   Point{  
  14. public:  
  15.     Point();  
  16.     Point(const Point&  rhs);  
  17. public:  
  18.     bool    operator==(const    Point&  rhs);  
  19.     bool    operator!=(const    Point&  rhs);  
  20.     Point&  operator= (const    Point&  rhs);  
  21. public:  
  22.     int     m_iRow;     //  
  23.     int     m_iCol;  
  24. };  
  25.   
  26. Point::Point(){}  
  27.   
  28. Point::Point(const  Point&  rhs){  
  29.     m_iRow      =rhs.m_iRow;  
  30.     m_iCol      =rhs.m_iCol;  
  31. }  
  32.   
  33. bool    Point::operator!=(const Point&  rhs){  
  34.     return  !operator==(rhs);  
  35. }  
  36.   
  37. bool    Point::operator==(const Point&  rhs){  
  38.     return  (m_iRow==   rhs.m_iRow)&&(m_iCol== rhs.m_iCol);  
  39. }  
  40.   
  41. Point&  Point::operator= (const Point&  rhs){  
  42.     m_iRow      =   rhs.m_iRow;  
  43.     m_iCol      =   rhs.m_iCol;  
  44.     return  *this;  
  45. }  
  46. //=========================================================================  
  47. //end of class  Point   define  
  48. //=========================================================================  
  49.   
  50.   
  51.   
  52.   
  53. //=========================================================================  
  54. //begin class   CState  define  
  55. //=========================================================================  
  56. class CState{           //存储9宫的状态  
  57. public:  
  58.     CState(const    CState& rhs);  
  59.     CState();  
  60.   
  61. public:  
  62.     CState& operator=(const CState& rhs);  
  63.     bool    operator==(const    CState& rhs);  
  64.   
  65. public:  
  66.     int     vValue[3][3];  
  67.     Point   m_Center;   //我们设0的位置是Center  
  68. };  
  69.   
  70. CState::CState( const CState& rhs):m_Center(rhs.m_Center){  
  71.     for(int iRow= 0; iRow< 3; ++iRow){  
  72.         for(int iCol= 0; iCol< 3; ++iCol)  
  73.             vValue[iRow][iCol]  =   rhs.vValue[iRow][iCol];  
  74.     }  
  75. }  
  76.   
  77. CState::CState(){}  
  78.   
  79. CState& CState::operator= (const    CState& rhs){  
  80.     m_Center        =   rhs.m_Center;  
  81.     for(int iRow= 0; iRow< 3; ++iRow){  
  82.         for(int iCol= 0; iCol< 3; ++iCol)  
  83.             vValue[iRow][iCol]  =   rhs.vValue[iRow][iCol];  
  84.     }  
  85.     return  *this;  
  86. }  
  87.   
  88. bool    CState::operator==(const    CState& rhs){  
  89.     if(m_Center !=  rhs.m_Center)  
  90.         return  false;  
  91.     for(int iRow= 0; iRow< 3; ++iRow){  
  92.         for(int iCol= 0; iCol< 3; ++iCol)  
  93.             if(vValue[iRow][iCol]   !=  rhs.vValue[iRow][iCol])  
  94.                 return  false;  
  95.     }  
  96.     return  true;  
  97. }  
  98. //=========================================================================  
  99. //end of class  CState  define  
  100. //=========================================================================   
  101.   
  102.   
  103. CState      StateBegin, StateEnd;   //开始和结束状态  
  104. int         Search();  
  105. int         StateToInt(const    CState& state);//编码  
  106. CState      IntToState(int      iState);       //解码  
  107.   
  108.   
  109. int main(){  
  110.     for(int iRow=   0; iRow< 3; ++iRow){  
  111.         for(int iCol= 0; iCol< 3; ++iCol){  
  112.             cin>>StateBegin.vValue[iRow][iCol];  
  113.             if(StateBegin.vValue[iRow][iCol]== 0){  
  114.                 StateBegin.m_Center.m_iRow= iRow;  
  115.                 StateBegin.m_Center.m_iCol= iCol;  
  116.             }  
  117.         }  
  118.     }  
  119.   
  120.     for(int iRow=   0; iRow< 3; ++iRow){  
  121.         for(int iCol= 0; iCol< 3; ++iCol){  
  122.             cin>>StateEnd.vValue[iRow][iCol];  
  123.             if(StateEnd.vValue[iRow][iCol]== 0){  
  124.                 StateEnd.m_Center.m_iRow=   iRow;  
  125.                 StateEnd.m_Center.m_iCol=   iCol;  
  126.             }  
  127.         }  
  128.     }  
  129.     cout<<Search()<<endl;  
  130. }  
  131.   
  132.   
  133. int         StateToInt(const    CState& state){//编码  
  134.     int     iValue  =   0;  
  135.     for(int iRow=   2; iRow>= 0; --iRow){  
  136.         for(int iCol=2; iCol>= 0; --iCol){  
  137.             iValue*= 9;  
  138.             iValue+= state.vValue[iRow][iCol];  
  139.         }  
  140.     }  
  141.     return  iValue;  
  142. }  
  143.   
  144. CState      IntToState(int      iState){       //解码  
  145.     CState  state;  
  146.     for(int iRow= 0; iRow< 3; ++iRow){  
  147.         for(int iCol= 0; iCol< 3; ++iCol){  
  148.             state.vValue[iRow][iCol]    =   iState%9;  
  149.             iState/= 9;  
  150.             if(state.vValue[iRow][iCol]== 0){  
  151.                 state.m_Center.m_iRow   =   iRow;  
  152.                 state.m_Center.m_iCol   =   iCol;  
  153.             }  
  154.         }  
  155.     }  
  156.     return  state;  
  157. }  
  158.   
  159. //=========================================================================  
  160. //BFS search  
  161. //=========================================================================   
  162. int         Search(){  
  163.     list<CState>  buffer1, buffer2;  
  164.     int             iStep= 0;  
  165.     list<CState>  *lpListUsed;        //存放当前这一步  
  166.     list<CState>  *lpListNextStep;    //存放下一步  
  167.     if(StateBegin== StateEnd)  
  168.         return  0;          //直接到达的话就是0了  
  169.     lpListUsed          =   &buffer1;  
  170.     lpListNextStep      =   &buffer2;  
  171.     lpListUsed->push_back(StateBegin);  
  172.     int     iPosition   =   StateToInt(StateBegin);  
  173.     bVisitTag[iPosition]        =   true;  
  174.     //bVisitTag[StateToInt(StateBegin)]=    true;   //打标记  
  175.     while(!lpListUsed->empty()){  
  176.         CState  StateNow;  
  177.         CState  StateNext;  
  178.         ++iStep;  
  179.         while(!lpListUsed->empty()){  
  180.             StateNow=   lpListUsed->front();  
  181.             lpListUsed->pop_front();  
  182.             if(StateNow==   StateEnd){  
  183.                 return  iStep-1;  
  184.             }  
  185.             if(StateNow.m_Center.m_iRow-1>= 0){  
  186.                 StateNext   =   StateNow;  
  187.                 --StateNext.m_Center.m_iRow;  
  188.                 StateNext.vValue[StateNow.m_Center.m_iRow][StateNow.m_Center.m_iCol]    =StateNow.vValue[StateNext.m_Center.m_iRow][StateNext.m_Center.m_iCol];  
  189.                 StateNext.vValue[StateNext.m_Center.m_iRow][StateNext.m_Center.m_iCol]  =   0;  
  190.                 int iPosition   =   StateToInt(StateNext);  
  191.                 if(!bVisitTag[iPosition]){  
  192.                     bVisitTag[iPosition]=   true;  
  193.                     lpListNextStep->push_back(StateNext);  
  194.                 }  
  195.             }  
  196.             if(StateNow.m_Center.m_iRow+1< 3){  
  197.                 StateNext   =   StateNow;  
  198.                 ++StateNext.m_Center.m_iRow;  
  199.                 StateNext.vValue[StateNow.m_Center.m_iRow][StateNow.m_Center.m_iCol]    =StateNow.vValue[StateNext.m_Center.m_iRow][StateNext.m_Center.m_iCol];  
  200.                 StateNext.vValue[StateNext.m_Center.m_iRow][StateNext.m_Center.m_iCol]  =   0;  
  201.                 int iPosition   =   StateToInt(StateNext);  
  202.                 if(!bVisitTag[iPosition]){  
  203.                     bVisitTag[iPosition]=   true;  
  204.                     lpListNextStep->push_back(StateNext);  
  205.                 }  
  206.             }  
  207.             if(StateNow.m_Center.m_iCol-1>= 0){  
  208.                 StateNext   =   StateNow;  
  209.                 --StateNext.m_Center.m_iCol;  
  210.                 StateNext.vValue[StateNow.m_Center.m_iRow][StateNow.m_Center.m_iCol]    =StateNow.vValue[StateNext.m_Center.m_iRow][StateNext.m_Center.m_iCol];  
  211.                 StateNext.vValue[StateNext.m_Center.m_iRow][StateNext.m_Center.m_iCol]  =   0;  
  212.                 int iPosition   =   StateToInt(StateNext);  
  213.                 if(!bVisitTag[iPosition]){  
  214.                     bVisitTag[iPosition]=   true;  
  215.                     lpListNextStep->push_back(StateNext);  
  216.                 }  
  217.             }  
  218.             if(StateNow.m_Center.m_iCol+1< 3){  
  219.                 StateNext   =   StateNow;  
  220.                 ++StateNext.m_Center.m_iCol;  
  221.                 StateNext.vValue[StateNow.m_Center.m_iRow][StateNow.m_Center.m_iCol]    =StateNow.vValue[StateNext.m_Center.m_iRow][StateNext.m_Center.m_iCol];  
  222.                 StateNext.vValue[StateNext.m_Center.m_iRow][StateNext.m_Center.m_iCol]  =   0;  
  223.                 int iPosition   =   StateToInt(StateNext);  
  224.                 if(!bVisitTag[iPosition]){  
  225.                     bVisitTag[iPosition]=   true;  
  226.                     lpListNextStep->push_back(StateNext);  
  227.                 }  
  228.             }  
  229.         }  
  230.         std::swap(lpListUsed, lpListNextStep);  
  231.     }  
  232.     return  -1;  
  233. }  
posted @ 2012-12-26 12:45  夜月神  阅读(285)  评论(0编辑  收藏  举报