基本信息
源码名称:C语言实现A*算法
源码大小:0.01M
文件格式:.cpp
开发语言:C/C++
更新时间:2020-11-09
   友情提示:(无需注册或充值,赞助后即可获取资源下载链接)

     嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300

本次赞助数额为: 2 元 
   源码介绍


A*算法是一种启发式图搜索算法,其特点在于对估价函数的定义上。对于一般的启发式图搜索,总是选择估价函数f值最小的节点作为扩展节点。因此,f是根据需要找到一条最小代价路径的观点来估算节点的,所以,可考虑每个节点n的估价函数值为两个分量:从起始节点到节点n的实际代价g(n)以及从节点n到达目标节点的估价代价h(n),节点到目的结点的最优路径的代价。

八数码问题是在3×3的九宫格棋盘上,摆有8个刻有18数码的将牌。棋盘中有一个空格,允许紧邻空格的某一将牌可以移到空格中,这样通过平移将牌可以将某一将牌布局变换为另一布局。针对给定的一种初始布局或结构(目标状态),问如何移动将牌,实现从初始状态到目标状态的转变。如下图表示了一个具体的八数码问题求解。


void move(node*head, int goalpos[9])
{
    if (ifhistory(head))
        return;
    node *origin = new node;
    if (ifsame(head,goalpos))//成功找到一条路,溯回并打印路径
    {
        cout << "根据A*算法,最佳路径如下:"<< endl;
        head->next = NULL;
        origin = head;
        while (origin->last)
            origin = origin->last;
        drawnum(origin);
        return;
    }
    
    node*temp = new node;
    head->next = temp;
    temp->last = head;
    copynodedata( head,temp);
    temp->depth = head->depth;
    temp->depth = 1;
    switch (head->position[0])//表示head节点中0的位置(1到9)
    {
    case 1:
    {
        int f[2];
        exchangestate(temp, 1, 2);
        updatef(temp, goalpos);
        f[0] = getf(temp);
        copynodedata(head, temp);
        exchangestate(temp, 1, 4);
        updatef(temp, goalpos);
        f[1] = getf(temp);
        if (f[1] <f[0])
            move(temp, goalpos);
        else if (f[1] >f[0])
        {
            copynodedata(head, temp);
            exchangestate(temp, 1, 2);
            updatef(temp, goalpos);
            move(temp, goalpos);
        }
        else
        {
            move(temp, goalpos);
            copynodedata(head, temp);
            exchangestate(temp, 1, 2);
            updatef(temp, goalpos);
            move(temp, goalpos);
        }
    }break;
    case 2:
    {
        int f[3];
        exchangestate(temp, 2, 1);
        updatef(temp, goalpos);
        f[0] = getf(temp);
        copynodedata(head, temp);
        exchangestate(temp, 2, 3);
        updatef(temp, goalpos);
        f[1] = getf(temp);
        copynodedata(head, temp);
        exchangestate(temp, 2, 5);
        updatef(temp, goalpos);
        f[2] = getf(temp);
        int min = f[0];
        for (int i = 0; i < 3; i )
        {
            if (f[i] <= min)
                min = f[i];
        }
        if(min==f[2])
            move(temp, goalpos);
        if (min == f[0])
        {
            copynodedata(head, temp);
            exchangestate(temp, 2,1);
            updatef(temp, goalpos);
            move(temp, goalpos);
        }
        if(min == f[1])
        {
            copynodedata(head, temp);
            exchangestate(temp, 2, 3);
            updatef(temp, goalpos);
            move(temp, goalpos);
        }
    }break;
    case 3:
    {
        int f[2];
        exchangestate(temp,3,2);
        updatef(temp, goalpos);
        f[0] = getf(temp);
        copynodedata(head, temp);
        exchangestate(temp, 3,6);
        updatef(temp, goalpos);
        f[1] = getf(temp);
        if (f[1] <f[0])
            move(temp, goalpos);
        else if (f[1] >f[0])
        {
            copynodedata(head, temp);
            exchangestate(temp, 1, 2);
            updatef(temp, goalpos);
            move(temp, goalpos);
        }
        else
        {
            move(temp, goalpos);
            copynodedata(head, temp);
            exchangestate(temp, 1, 2);
            updatef(temp, goalpos);
            move(temp, goalpos);
        }
    }break;
    case 4:
    {
        int f[3];
        exchangestate(temp, 4,1);
        updatef(temp, goalpos);
        f[0] = getf(temp);
        copynodedata(head, temp);
        exchangestate(temp,4,5);
        updatef(temp, goalpos);
        f[1] = getf(temp);
        copynodedata(head, temp);
        exchangestate(temp, 4,7);
        updatef(temp, goalpos);
        f[2] = getf(temp);
        int min = f[0];
        for (int i = 0; i < 3; i )
        {
            if (f[i] <= min)
                min = f[i];
        }
        if (min == f[2])
            move(temp, goalpos);
        if (min == f[0])
        {
            copynodedata(head, temp);
            exchangestate(temp, 4,1);
            updatef(temp, goalpos);
            move(temp, goalpos);
        }
        if (min == f[1])
        {
            copynodedata(head, temp);
            exchangestate(temp, 4,5);
            updatef(temp, goalpos);
            move(temp, goalpos);
        }
    }break;
    case 5:
    {
        int f[4];
        exchangestate(temp, 5,2);
        updatef(temp, goalpos);
        f[0] = getf(temp);
        copynodedata(head, temp);
        exchangestate(temp,5,4);
        updatef(temp, goalpos);
        f[1] = getf(temp);
        copynodedata(head, temp);
        exchangestate(temp,5,6);
        updatef(temp, goalpos);
        f[2] = getf(temp);
        copynodedata(head, temp);
        exchangestate(temp, 5,8);
        updatef(temp, goalpos);
        f[3] = getf(temp);
        int min = f[0];
        for (int i = 0; i <4; i )
        {
            if (f[i] <= min)
                min = f[i];
        }
        if (min == f[3])
            move(temp, goalpos);
        if (min == f[0])
        {
            copynodedata(head, temp);
            exchangestate(temp, 5,2);
            updatef(temp, goalpos);
            move(temp, goalpos);
        }
        if(min==f[1])
        {
            copynodedata(head, temp);
            exchangestate(temp, 5,4);
            updatef(temp, goalpos);
            move(temp, goalpos);
        }
        if (min == f[2])
        {
            copynodedata(head, temp);
            exchangestate(temp, 5,6);
            updatef(temp, goalpos);
            move(temp, goalpos);
        }
    }break;
    case 6:
    {
        int f[3];
        exchangestate(temp,6,3);
        updatef(temp, goalpos);
        f[0] = getf(temp);
        copynodedata(head, temp);
        exchangestate(temp, 6,5);
        updatef(temp, goalpos);
        f[1] = getf(temp);
        copynodedata(head, temp);
        exchangestate(temp, 6,9);
        updatef(temp, goalpos);
        f[2] = getf(temp);
        int min = f[0];
        for (int i = 0; i < 3; i )
        {
            if (f[i] <= min)
                min = f[i];
        }
        if (min == f[2])
            move(temp, goalpos);
        if (min == f[0])
        {
            copynodedata(head, temp);
            exchangestate(temp, 6,3);
            updatef(temp, goalpos);
            move(temp, goalpos);
        }
        if (min == f[1])
        {
            copynodedata(head, temp);
            exchangestate(temp,6,5);
            updatef(temp, goalpos);
            move(temp, goalpos);
        }
    }break;
    case 7:
    {
        int f[2];
        exchangestate(temp, 7,4);
        updatef(temp, goalpos);
        f[0] = getf(temp);
        copynodedata(head, temp);
        exchangestate(temp,7,8);
        updatef(temp, goalpos);
        f[1] = getf(temp);
        if (f[1] <f[0])
            move(temp, goalpos);
        else if (f[1] >f[0])
        {
            copynodedata(head, temp);
            exchangestate(temp, 1, 2);
            updatef(temp, goalpos);
            move(temp, goalpos);
        }
        else
        {
            move(temp, goalpos);
            copynodedata(head, temp);
            exchangestate(temp, 1, 2);
            updatef(temp, goalpos);
            move(temp, goalpos);
        }
    }break;
    case 8:
    {
        int f[3];
        exchangestate(temp,8,7);
        updatef(temp, goalpos);
        f[0] = getf(temp);
        copynodedata(head, temp);
        exchangestate(temp,8,5);
        updatef(temp, goalpos);
        f[1] = getf(temp);
        copynodedata(head, temp);
        exchangestate(temp, 8,9);
        updatef(temp, goalpos);
        f[2] = getf(temp);
        int min = f[0];
        for (int i = 0; i < 3; i )
        {
            if (f[i] <= min)
                min = f[i];
        }
        if (min == f[2])
            move(temp, goalpos);
        if (min == f[0])
        {
            copynodedata(head, temp);
            exchangestate(temp, 8,7);
            updatef(temp, goalpos);
            move(temp, goalpos);
        }
        if (min == f[1])
        {
            copynodedata(head, temp);
            exchangestate(temp,8,5);
            updatef(temp, goalpos);
            move(temp, goalpos);
        }

    }break;
    case 9:
    {
        int f[2];
        exchangestate(temp, 9, 6);
        updatef(temp, goalpos);
        f[0] = getf(temp);
        copynodedata(head, temp);
        exchangestate(temp, 9, 8);
        updatef(temp, goalpos);
        f[1] = getf(temp);
        if (f[1] <f[0])
            move(temp, goalpos);
        else if (f[1] >f[0])
        {
            copynodedata(head, temp);
            exchangestate(temp, 1, 2);
            updatef(temp, goalpos);
            move(temp, goalpos);
        }
        else
        {
            move(temp, goalpos);
            copynodedata(head, temp);
            exchangestate(temp, 1, 2);
            updatef(temp, goalpos);
            move(temp, goalpos);
        }
    }break;
    default:
    {
        ;
    }break;
    }
    
}