Exemplo n.º 1
0
/////////////////////////////////////////
//    LoadData:载入数据
//    生成当前操作状态 
//    并将当状态加入搜索树中
/////////////////////////////////////////
BOOL CMain::LoadData(BOOL Adv)
{
	if(Adv == false)
	{
	 CInitDialog InitDlg;
	 if(InitDlg.DoModal()==IDOK)
	 {
		CDisplay *DispItem;DispItem = new CDisplay;
		m_CurrentG = 0;
		for(int i=0; i<MaxItem; i++)
		 for(int j=0; j<MaxItem; j++)
		 {
			this->m_Desc[i][j] = InitDlg.GetDescData(i,j);
			this->m_Data[i][j] = InitDlg.GetSrcData(i,j);
			DispItem->LoadData(m_Data[i][j],i,j);
		 }
		 DispItem->SetNoteType(AlReady);
		 DispItem->SetThisIsAAnswer();
		 DispItem->SetCurrentG(m_CurrentG);
		 DispItem->SetCurrentCount(0);
		 m_CurOpItem = DispItem;
		 m_DispList.AddTail(DispItem);
		return TRUE;
	 }
	 else return FALSE;
	}
	else
	{
	 CInputAdvDlg InitDlg;
	 if(InitDlg.DoModal()==IDOK)
	 {
		CDisplay *DispItem;DispItem = new CDisplay;
		m_CurrentG = 0;
		for(int i=0; i<MaxItem; i++)
		 for(int j=0; j<MaxItem; j++)
		 {
			this->m_Desc[i][j] = InitDlg.GetDescData(i,j);
			this->m_Data[i][j] = InitDlg.GetSrcData(i,j);
			DispItem->LoadData(m_Data[i][j],i,j);
		 }
		 DispItem->SetNoteType(AlReady);
		 DispItem->SetThisIsAAnswer();
		 DispItem->SetCurrentG(m_CurrentG);
		 DispItem->SetCurrentCount(0);
		 m_CurOpItem = DispItem;
		 m_DispList.AddTail(DispItem);
		return TRUE;
	 }
	 else return FALSE;
	}
}
Exemplo n.º 2
0
///////////////////////////////////////////
// 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;
}