/////////////////////////////////////// // FindOtherNote: 用于回溯 寻找另一个节点 // 参数:当前G值 // 返回值:是否找到新节点 /////////////////////////////////////// BOOL CMain::FindOtherNote(int CurrentG) { POSITION pos = m_DispList.GetTailPosition(); while(pos) { CDisplay *Item = (CDisplay *)m_DispList.GetPrev(pos); if(Item->GetCurrentG() != CurrentG) continue;//没有到当前层 if(Item->GetNoteType() != NotYet) continue;//当前结点不是没有被扩展的结点 m_CurOpItem = Item; return TRUE; } return FALSE; }
/////////////////////////////////////////// // FindBestMoveFlag:寻找最佳移动方式 并移动之 // 入口: GenerateChild(); // 参数:子节点集 // 返回值:错误代码 ////////////////////////////////////////// UINT CMain::FindBestMoveFlag(List *pList) { //计算移动后是否有重复项 重复项不参加最佳选择运算 IsReadyExist(pList); //在没有出现过移动结果中选择最佳解 POSITION Pos = pList->GetHeadPosition(); int H[4]={65535,65535,65535,65535},i=0,Min = 65535; POSITION MinPos; while(Pos) { POSITION CurPos = Pos; CDisplay *Item = (CDisplay *)pList->GetNext(Pos); if(Item->GetNoteType() == AlReady) {i++;continue;} H[i] = CaculateH(Item); if(Min>H[i]) {Min=H[i];MinPos = CurPos;} i++; } if(Min == 65535) {/* //没有找到最佳方法 表示这个结点所有子项都已扩展。要回溯 //但在本程序中 由于输入值一定有解,可以不要回溯 for(int CurrentG = this->m_CurrentG;CurrentG>0;CurrentG--) if(FindOtherNote(CurrentG)) return NoError;//找到了另一个未扩展的结点返回 */ return ErrorCode;//没有未扩展的结点了 本题无解 } //标记最佳解 Pos = pList->GetHeadPosition(); while(Pos) { POSITION CurPos = Pos; CDisplay *Item = (CDisplay *)m_DispList.GetNext(Pos); if(CurPos == MinPos) { Item->SetThisIsAAnswer();//是解 Item->SetNoteType(AlReady);//被扩展 m_CurOpItem = Item; } m_DispList.AddTail(Item); } return NoError; }