Beispiel #1
0
int TAstar::Repeat(TList<TAstar> &L)  
{  
    int n=L.Getlen(); 
	int i; 
    for( i=0;i<n;i++)  
        if(L.GetData(i)==*this)  
            break;  
    return i;  
}  
void TAstar::Search()
{
	TAstar T = *this;              //初始结点   
	T.f = T.Calcuf();               //初始结点的估价函数   
	TList<TAstar> L;           //建立队列   
	L.Append(T);                 //初始结点入队   
	int head = 0, tail = 0;           //队列头和尾指针   
	while (head <= tail)           //队列不空则循环   
	{
		for (int i = 0; i<4; i++)            //空格可能移动方向   
		{
			T = L.GetData(head);   //去队列头结点   
			if (T.h == 0)                   //是目标结点   
			{
				T.Printl(L);//输出搜索路径   
				//T.Printf();    //输出目标状态   
				//printf("%d\n", T.getZeroPos());
				this->rs.push_back(T.getZeroPos());
				return;        //结束   
			}
			if (T.Expend(i))          //若结点可扩展   
			{
				int k = T.Repeat(L); //返回与已扩展结点重复的序号        
				if (k<head)               //如果是不能扩展的结点   
					continue; //丢弃   
				T.last = head;      //不是不能扩展的结点,记录父结点   
				T.f = T.Calcuf(); //计算f   
				if (k <= tail)         //新结点与可扩展结点重复   
				{
					TAstar Temp = L.GetData(k);
					if (Temp.g>T.g)         //比较两结点g值   
						L.SetData(T, k); //保留g值小的   
					continue;
				}
				T.Sort(L, head);            //新结点插入可扩展结点队列        
				tail++;        //队列尾指针后移    
			}
		}
		head++; //一个结点不能再扩展,队列头指针指向下一结点   
	}
}
Beispiel #3
0
void TAstar::Sort(TList<TAstar>& L,int k)  
{  
    int n=L.Getlen();
	int i;  
    for( i=k+1;i<n;i++)  
    {  
        TAstar T=L.GetData(i);  
        if(this->f<=T.f)  
            break;  
    }  
    L.Insert(*this,i);  
}  
Beispiel #4
0
void TAstar::Printl(TList<TAstar> L)   
{  
    TAstar T=*this;  
    if(T.last==-1)  
        return;  
    else  
    {  
        T=L.GetData(T.last);  
        T.Printl(L);  
        T.Printf();  
    }  
}  
void TAstar::Printl(TList<TAstar> L)
{
	TAstar T = *this;
	if (T.last == -1)
		return;
	else
	{
		T = L.GetData(T.last);
		T.Printl(L);
		//T.Printf();
		//printf("%d\n", T.getZeroPos());
		this->rs.push_back(T.getZeroPos());
	}
}