在好例子网,分享、交流、成长!
您当前所在位置:首页C/C++ 开发实例常规C/C++编程 → C语言实现A*算法

C语言实现A*算法

常规C/C++编程

下载此实例
  • 开发语言:C/C++
  • 实例大小:0.01M
  • 下载次数:18
  • 浏览次数:89
  • 发布时间:2020-11-09
  • 实例类别:常规C/C++编程
  • 发 布 人:白羽青翎
  • 文件格式:.cpp
  • 所需积分:2
 相关标签: C语言 实现 语言 算法

实例介绍

【实例简介】


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

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


【实例截图】

from clipboard

【核心代码】

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;
    }
    
}

实例下载地址

C语言实现A*算法

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警