首页 > 软件开发 > C语言 >

人工智能算法实现:[1]A*算法c语言

来源:互联网 2023-03-16 19:12:07 80

A*算法,A*(A-Star)算法是一种静态路网中求解最短路最有效的方法。估价值与实际值越接近,估价函数取得就越好。Sk4办公区 - 实用经验教程分享!

A*[1](A-Star)算法是一种静态路网中求解最短路最有效的方法。Sk4办公区 - 实用经验教程分享!

公式表示为: f(n)=g(n) h(n),Sk4办公区 - 实用经验教程分享!

其中 f(n) 是从初始点经由节点n到目标点的估价函数,Sk4办公区 - 实用经验教程分享!

g(n) 是在状态空间中从初始节点到n节点的实际代价,Sk4办公区 - 实用经验教程分享!

h(n) 是从n到目标节点最佳路径的估计代价。Sk4办公区 - 实用经验教程分享!

保证找到最短路径(最优解的)条件,关键在于估价函数h(n)的选取:Sk4办公区 - 实用经验教程分享!

估价值h(n)= n到目标节点的距离实际值,这种情况下,搜索的点数多,搜索范围大,效率低。但能得到最优解。Sk4办公区 - 实用经验教程分享!

如果 估价值>实际值,搜索的点数少,搜索范围小,效率高,但不能保证得到最优解。Sk4办公区 - 实用经验教程分享!

工具/原料

  • DEVC 或 VC 6.0/

方法/步骤

  • 1

    估价值与实际值越接近,估价函数取得各处就越好Sk4办公区 - 实用经验教程分享!

    例如对于几何路网来说,可以取两节点间欧几理德距离(直线距离)做为估价值,即f=g(n) sqrt((dx-nx)*(dx-nx) (dy-ny)*(dy-ny));这样估价函召兼数f在g值一定的情况下,会或多或少的受估价值h的制约,节点距目标点近,h值小,f值相对就小,能保证最短路的搜索向终点的方向脂沫互进行。明显优于Dijkstra算法的毫无方向的向四周搜索。Sk4办公区 - 实用经验教程分享!

    conditions of heuristicSk4办公区 - 实用经验教程分享!

    Optimistic (must be less than or equal to the real cost)Sk4办公区 - 实用经验教程分享!

    As close to the real cost as possibleSk4办公区 - 实用经验教程分享!

    详细内容:Sk4办公区 - 实用经验教程分享!

    创建两个表,OPEN表保存所有已生成而未考察的节点,CLOSED表中记录已访问过的节点。Sk4办公区 - 实用经验教程分享!

    算起点的估价值;Sk4办公区 - 实用经验教程分享!

    将起点放入OPEN表;Sk4办公区 - 实用经验教程分享!

    人工智能算法实现:[1]A*算法c语言Sk4办公区 - 实用经验教程分享!

  • 2

    A star算法在静态路网中的应用,以在地图中找从开始点 s 到e点的最短行走路径为例:Sk4办公区 - 实用经验教程分享!

    首先定义数据结构Sk4办公区 - 实用经验教程分享!

    #define MAPMAXSIZE 100 //地图面积最大为 100x100Sk4办公区 - 实用经验教程分享!

    #define MAXINT 8192 //定义一个最大整数, 地图上任意两点距离不会超过它Sk4办公区 - 实用经验教程分享!

    #define STACKSIZE 65536 //保存搜索节点的堆栈大小Sk4办公区 - 实用经验教程分享!

    Sk4办公区 - 实用经验教程分享!

    #define tile_num(x,y) ((y)*map_w (x)) //将 x,y 坐标转换为地图上块的编号Sk4办公区 - 实用经验教程分享!

    #define tile_x(n) ((n)%map_w) //由块编号得出 x,y 坐标Sk4办公区 - 实用经验教程分享!

    #define tile_y(n) ((n)/map_w)Sk4办公区 - 实用经验教程分享!

    Sk4办公区 - 实用经验教程分享!

    // 树结构, 比较特殊, 是从叶节点向根节点反向链接Sk4办公区 - 实用经验教程分享!

    typedef struct node *TREE;Sk4办公区 - 实用经验教程分享!

    Sk4办公区 - 实用经验教程分享!

    struct node {Sk4办公区 - 实用经验教程分享!

    int h;Sk4办公区 - 实用经验教程分享!

    int tile;Sk4办公区 - 实用经验教程分享!

    TREE father;Sk4办公区 - 实用经验教程分享!

    };Sk4办公区 - 实用经验教程分享!

    Sk4办公区 - 实用经验教程分享!

    typedef struct node2 *LINK;Sk4办公区 - 实用经验教程分享!

    Sk4办公区 - 实用经验教程分享!

    struct node2 {Sk4办公区 - 实用经验教程分享!

    TREE node;Sk4办公区 - 实用经验教程分享!

    int f;Sk4办公区 - 实用经验教程分享!

    LINK next;Sk4办公区 - 实用经验教程分享!

    };Sk4办公区 - 实用经验教程分享!

    Sk4办公区 - 实用经验教程分享!

    LINK queue; // 保存没有处理的行走方法的节点Sk4办公区 - 实用经验教程分享!

    TREE stack[STACKSIZE]; // 保存已经处理过的节点 (搜索完后释放)Sk4办公区 - 实用经验教程分享!

    int stacktop;Sk4办公区 - 实用经验教程分享!

    char map[][6]={{'x','x','x','x','x','x'},Sk4办公区 - 实用经验教程分享!

    {'x','e',' ',' ',' ','x'},Sk4办公区 - 实用经验教程分享!

    {'x','x',' ','x',' ','x'},Sk4办公区 - 实用经验教程分享!

    {'x','x',' ',' ',' ','x'},Sk4办公区 - 实用经验教程分享!

    {'x','x','x','x','s','x'},Sk4办公区 - 实用经验教程分享!

    {'x','x','x','x','x','x'} };//地图数据Sk4办公区 - 实用经验教程分享!

    int dis_map[MAPMAXSIZE][MAPMAXSIZE];//保存搜索路径时,中间目标地最优解Sk4办公区 - 实用经验教程分享!

    Sk4办公区 - 实用经验教程分享!

    int map_w,map_h;//地图宽和高Sk4办公区 - 实用经验教程分享!

    int start_x,start_y,end_x,end_y; //地点,终点坐标Sk4办公区 - 实用经验教程分享!

    Sk4办公区 - 实用经验教程分享!

    // 路径寻找主函数Sk4办公区 - 实用经验教程分享!

    void findpath(int *path)Sk4办公区 - 实用经验教程分享!

    {Sk4办公区 - 实用经验教程分享!

    //printf("%d,%d,%d,%d",start_x,start_y,end_x,end_y);Sk4办公区 - 实用经验教程分享!

    TREE root;Sk4办公区 - 实用经验教程分享!

    int i,j;Sk4办公区 - 实用经验教程分享!

    stacktop=0;Sk4办公区 - 实用经验教程分享!

    for (i=0;imap_h;i )Sk4办公区 - 实用经验教程分享!

    for (j=0;jmap_w;j )Sk4办公区 - 实用经验教程分享!

    dis_map[i][j]=MAXINT;Sk4办公区 - 实用经验教程分享!

    init_queue();Sk4办公区 - 实用经验教程分享!

    root=(TREE)malloc(sizeof(*root));Sk4办公区 - 实用经验教程分享!

    root->tile=tile_num(start_x,start_y);Sk4办公区 - 实用经验教程分享!

    root->h=0;Sk4办公区 - 实用经验教程分享!

    root->father=NULL;Sk4办公区 - 实用经验教程分享!

    enter_queue(root,judge(start_x,start_y));Sk4办公区 - 实用经验教程分享!

    for (;;) {Sk4办公区 - 实用经验教程分享!

    int x,y,child;Sk4办公区 - 实用经验教程分享!

    TREE p;Sk4办公区 - 实用经验教程分享!

    root=get_from_queue();Sk4办公区 - 实用经验教程分享!

    if (root==NULL) {Sk4办公区 - 实用经验教程分享!

    *path=-1;Sk4办公区 - 实用经验教程分享!

    return;Sk4办公区 - 实用经验教程分享!

    }Sk4办公区 - 实用经验教程分享!

    x=tile_x(root->tile);Sk4办公区 - 实用经验教程分享!

    y=tile_y(root->tile);Sk4办公区 - 实用经验教程分享!

    if (x==end_x && y==end_y) break;// 达到目的地成功返回Sk4办公区 - 实用经验教程分享!

    Sk4办公区 - 实用经验教程分享!

    child=trytile(x,y-1,root);//尝试向上移动Sk4办公区 - 实用经验教程分享!

    child&=trytile(x,y 1,root);//尝试向下移动Sk4办公区 - 实用经验教程分享!

    child&=trytile(x-1,y,root);//尝试向左移动Sk4办公区 - 实用经验教程分享!

    child&=trytile(x 1,y,root);//尝试向右移动Sk4办公区 - 实用经验教程分享!

    if (child!=0)Sk4办公区 - 实用经验教程分享!

    pop_stack();// 如果四个方向均不能移动,释放这个死节点Sk4办公区 - 实用经验教程分享!

    }Sk4办公区 - 实用经验教程分享!

    Sk4办公区 - 实用经验教程分享!

    // 回溯树,将求出的最佳路径保存在 path[] 中Sk4办公区 - 实用经验教程分享!

    for (i=0;root;i ) {Sk4办公区 - 实用经验教程分享!

    path[i]=root->tile;Sk4办公区 - 实用经验教程分享!

    root=root->father;Sk4办公区 - 实用经验教程分享!

    //printf("pathis %d",path[i]);Sk4办公区 - 实用经验教程分享!

    }Sk4办公区 - 实用经验教程分享!

    Sk4办公区 - 实用经验教程分享!

    path[i]=-1;Sk4办公区 - 实用经验教程分享!

    freetree();Sk4办公区 - 实用经验教程分享!

    }Sk4办公区 - 实用经验教程分享!

    // 估价函数,估价 x,y 到目的地的距离,估计值必须保证比实际值小Sk4办公区 - 实用经验教程分享!

    int judge(int x,int y)Sk4办公区 - 实用经验教程分享!

    {Sk4办公区 - 实用经验教程分享!

    int distance;Sk4办公区 - 实用经验教程分享!

    distance=abs(end_x-x) abs(end_y-y);Sk4办公区 - 实用经验教程分享!

    return distance;Sk4办公区 - 实用经验教程分享!

    }Sk4办公区 - 实用经验教程分享!

    Sk4办公区 - 实用经验教程分享!

    // 尝试下一步移动到 x,y 可行否Sk4办公区 - 实用经验教程分享!

    int trytile(int x,int y,TREE father)Sk4办公区 - 实用经验教程分享!

    {Sk4办公区 - 实用经验教程分享!

    TREE p=father;Sk4办公区 - 实用经验教程分享!

    int h;Sk4办公区 - 实用经验教程分享!

    if (map[y][x]=='x') return 1; // 如果 (x,y) 处是障碍,失败Sk4办公区 - 实用经验教程分享!

    while (p) {Sk4办公区 - 实用经验教程分享!

    if (x==tile_x(p->tile) && y==tile_y(p->tile)) return 1; //如果 (x,y) 曾经经过,失败Sk4办公区 - 实用经验教程分享!

    p=p->father;Sk4办公区 - 实用经验教程分享!

    }Sk4办公区 - 实用经验教程分享!

    h=father->h 1;Sk4办公区 - 实用经验教程分享!

    if (h>=dis_map[y][x]) return 1;// 如果曾经有更好的方案移动到 (x,y) 失败Sk4办公区 - 实用经验教程分享!

    dis_map[y][x]=h;// 记录这次到 (x,y) 的距离为历史最佳距离Sk4办公区 - 实用经验教程分享!

    Sk4办公区 - 实用经验教程分享!

    // 将这步方案记入待处理队列Sk4办公区 - 实用经验教程分享!

    p=(TREE)malloc(sizeof(*p));Sk4办公区 - 实用经验教程分享!

    p->father=father;Sk4办公区 - 实用经验教程分享!

    p->h=father->h 1;Sk4办公区 - 实用经验教程分享!

    p->tile=tile_num(x,y);Sk4办公区 - 实用经验教程分享!

    enter_queue(p,p->h judge(x,y));Sk4办公区 - 实用经验教程分享!

    return 0;Sk4办公区 - 实用经验教程分享!

    }Sk4办公区 - 实用经验教程分享!

    人工智能算法实现:[1]A*算法c语言Sk4办公区 - 实用经验教程分享!

  • 2此文章未经许可获取自百度经验
  • 3

    打开c语言编译器,输入我们的运行代码,编译,运行如下,打印出地图如下图:Sk4办公区 - 实用经验教程分享!

    人工智能算法实现:[1]A*算法c语言Sk4办公区 - 实用经验教程分享!

    人工智能算法实现:[1]A*算法c语言Sk4办公区 - 实用经验教程分享!

  • 4

    点任意键进行运行找静态路网Sk4办公区 - 实用经验教程分享!

    人工智能算法实现:[1]A*算法c语言Sk4办公区 - 实用经验教程分享!

    人工智能算法实现:[1]A*算法c语言Sk4办公区 - 实用经验教程分享!

    人工智能算法实现:[1]A*算法c语言Sk4办公区 - 实用经验教程分享!

  • 5

    说明:找到路后会存到一个数组中去,我们为了显示这个过程可以运用打印函数打印出来代码如下Sk4办公区 - 实用经验教程分享!

    void printpath(int *path)Sk4办公区 - 实用经验教程分享!

    {Sk4办公区 - 实用经验教程分享!

    int i;Sk4办公区 - 实用经验教程分享!

    //printf("-44444444444444");Sk4办公区 - 实用经验教程分享!

    for (i=0;path[i]>=0;i ) {Sk4办公区 - 实用经验教程分享!

    Sk4办公区 - 实用经验教程分享!

    gotoxy(tile_x(path[i]) 1,tile_y(path[i]) 1);Sk4办公区 - 实用经验教程分享!

    printf("-");Sk4办公区 - 实用经验教程分享!

    Sleep(2000); Sk4办公区 - 实用经验教程分享!

    }Sk4办公区 - 实用经验教程分享!

    printf("\n");Sk4办公区 - 实用经验教程分享!

    printf("\n");Sk4办公区 - 实用经验教程分享!

    printf("走迷宫完成");Sk4办公区 - 实用经验教程分享!

    }Sk4办公区 - 实用经验教程分享!

  • 6

    整个程序的代码如下:Sk4办公区 - 实用经验教程分享!

    #includewindows.h>Sk4办公区 - 实用经验教程分享!

    #include"stdio.h"Sk4办公区 - 实用经验教程分享!

    #includeconio.h>Sk4办公区 - 实用经验教程分享!

    #include"assert.h"Sk4办公区 - 实用经验教程分享!

    #include"stdlib.h"Sk4办公区 - 实用经验教程分享!

    #define MAPMAXSIZE 100 //地图面积最大为 100x100Sk4办公区 - 实用经验教程分享!

    #define MAXINT 8192 //定义一个最大整数, 地图上任意两点距离不会超过它Sk4办公区 - 实用经验教程分享!

    #define STACKSIZE 65536 //保存搜索节点的堆栈大小Sk4办公区 - 实用经验教程分享!

    Sk4办公区 - 实用经验教程分享!

    #define tile_num(x,y) ((y)*map_w (x)) //将 x,y 坐标转换为地图上块的编号Sk4办公区 - 实用经验教程分享!

    #define tile_x(n) ((n)%map_w) //由块编号得出 x,y 坐标Sk4办公区 - 实用经验教程分享!

    #define tile_y(n) ((n)/map_w)Sk4办公区 - 实用经验教程分享!

    Sk4办公区 - 实用经验教程分享!

    // 树结构, 比较特殊, 是从叶节点向根节点反向链接Sk4办公区 - 实用经验教程分享!

    typedef struct node *TREE;Sk4办公区 - 实用经验教程分享!

    Sk4办公区 - 实用经验教程分享!

    struct/*designde by 1wangxiaobo@163.com*/ node {Sk4办公区 - 实用经验教程分享!

    int h;Sk4办公区 - 实用经验教程分享!

    int tile;Sk4办公区 - 实用经验教程分享!

    TREE father;Sk4办公区 - 实用经验教程分享!

    };Sk4办公区 - 实用经验教程分享!

    Sk4办公区 - 实用经验教程分享!

    typedef struct /*designde by 1wangxiaobo@163.com*/node2 *LINK;Sk4办公区 - 实用经验教程分享!

    Sk4办公区 - 实用经验教程分享!

    struct node2 {Sk4办公区 - 实用经验教程分享!

    TREE node;Sk4办公区 - 实用经验教程分享!

    int f;/*designde by 1wangxiaobo@163.com*/Sk4办公区 - 实用经验教程分享!

    LINK next;Sk4办公区 - 实用经验教程分享!

    };Sk4办公区 - 实用经验教程分享!

    Sk4办公区 - 实用经验教程分享!

    LINK queue; // 保存没有处理的行走方法的节点Sk4办公区 - 实用经验教程分享!

    TREE stack[STACKSIZE]; // 保存已经处理过的节点 (搜索完后释放)Sk4办公区 - 实用经验教程分享!

    int stacktop;Sk4办公区 - 实用经验教程分享!

    char map[][6]={{'x','x','x','x','x','x'},Sk4办公区 - 实用经验教程分享!

    {'x','e',' ',' ',' ','x'},Sk4办公区 - 实用经验教程分享!

    {'x','x',' ','x',' ','x'},Sk4办公区 - 实用经验教程分享!

    {'x','x',' ',' ',' ','x'},Sk4办公区 - 实用经验教程分享!

    {'x','x','x','x','s','x'},Sk4办公区 - 实用经验教程分享!

    {'x','x','x','x','x','x'} };//地图数据Sk4办公区 - 实用经验教程分享!

    int dis_map/*designde by 1wangxiaobo@163.com*/[MAPMAXSIZE][MAPMAXSIZE];//保存搜索路径时,中间目标地最优解Sk4办公区 - 实用经验教程分享!

    Sk4办公区 - 实用经验教程分享!

    int map_w,map_h;//地图宽和高Sk4办公区 - 实用经验教程分享!

    int start_x,start_y,end_x,end_y; //地点,终点坐标Sk4办公区 - 实用经验教程分享!

    void gotoxy(int x ,int y)Sk4办公区 - 实用经验教程分享!

    {Sk4办公区 - 实用经验教程分享!

    Sk4办公区 - 实用经验教程分享!

    HANDLE a;Sk4办公区 - 实用经验教程分享!

    COORD zb;Sk4办公区 - 实用经验教程分享!

    zb.X =x-1;Sk4办公区 - 实用经验教程分享!

    zb.Y =y-1;Sk4办公区 - 实用经验教程分享!

    Sk4办公区 - 实用经验教程分享!

    a= GetStdHandle(STD_OUTPUT_HANDLE/*designde by 1wangxiaobo@163.com*/);Sk4办公区 - 实用经验教程分享!

    Sk4办公区 - 实用经验教程分享!

    SetConsoleCursorPosition(a,zb);Sk4办公区 - 实用经验教程分享!

    Sk4办公区 - 实用经验教程分享!

    }Sk4办公区 - 实用经验教程分享!

    // 初始化队列Sk4办公区 - 实用经验教程分享!

    void init_queue()Sk4办公区 - 实用经验教程分享!

    {Sk4办公区 - 实用经验教程分享!

    queue=(LINK)malloc(sizeof(*queue));Sk4办公区 - 实用经验教程分享!

    queue->node=NULL;Sk4办公区 - 实用经验教程分享!

    queue->f=-1;Sk4办公区 - 实用经验教程分享!

    queue->next=(LINK)/*designde by 1wangxiaobo@163.com*/malloc(sizeof(*queue));Sk4办公区 - 实用经验教程分享!

    queue->next->f=MAXINT;Sk4办公区 - 实用经验教程分享!

    queue->next->node=NULL;Sk4办公区 - 实用经验教程分享!

    queue->next->next=NULL;Sk4办公区 - 实用经验教程分享!

    }Sk4办公区 - 实用经验教程分享!

    Sk4办公区 - 实用经验教程分享!

    // 待处理节点入队列, 依靠对目的地估价距离插入排序Sk4办公区 - 实用经验教程分享!

    void enter_queue(TREE node,int f)Sk4办公区 - 实用经验教程分享!

    {Sk4办公区 - 实用经验教程分享!

    LINK p=queue,father,q;Sk4办公区 - 实用经验教程分享!

    while(f>p->f) {Sk4办公区 - 实用经验教程分享!

    father=p;Sk4办公区 - 实用经验教程分享!

    p=p->next/*designde by 1wangxiaobo@163.com*/;Sk4办公区 - 实用经验教程分享!

    assert(p);Sk4办公区 - 实用经验教程分享!

    }Sk4办公区 - 实用经验教程分享!

    q=(LINK)malloc(sizeof(*q));Sk4办公区 - 实用经验教程分享!

    assert(queue);Sk4办公区 - 实用经验教程分享!

    q->f=f,q->node=node,q->next=p;Sk4办公区 - 实用经验教程分享!

    father->next=q;Sk4办公区 - 实用经验教程分享!

    }Sk4办公区 - 实用经验教程分享!

    Sk4办公区 - 实用经验教程分享!

    // 将离目的地估计最近的方案出队列Sk4办公区 - 实用经验教程分享!

    TREE get_from_queue()Sk4办公区 - 实用经验教程分享!

    {Sk4办公区 - 实用经验教程分享!

    TREE bestchoice=queue->next->node;Sk4办公区 - 实用经验教程分享!

    LINK next=queue->next->next;Sk4办公区 - 实用经验教程分享!

    /*designde by 1wangxiaobo@163.com*/free(queue->next);Sk4办公区 - 实用经验教程分享!

    queue->next=next;Sk4办公区 - 实用经验教程分享!

    stack[stacktop ]=bestchoice;Sk4办公区 - 实用经验教程分享!

    assert(stacktopSTACKSIZE);Sk4办公区 - 实用经验教程分享!

    return /*designde by 1wangxiaobo@163.com*/bestchoice;Sk4办公区 - 实用经验教程分享!

    }Sk4办公区 - 实用经验教程分享!

    Sk4办公区 - 实用经验教程分享!

    // 释放栈顶节点Sk4办公区 - 实用经验教程分享!

    void pop_stack()Sk4办公区 - 实用经验教程分享!

    {Sk4办公区 - 实用经验教程分享!

    free(stack[--stacktop]);Sk4办公区 - 实用经验教程分享!

    }Sk4办公区 - 实用经验教程分享!

    Sk4办公区 - 实用经验教程分享!

    // 释放申请过的所有节点Sk4办公区 - 实用经验教程分享!

    void freetree()Sk4办公区 - 实用经验教程分享!

    {Sk4办公区 - 实用经验教程分享!

    int i;Sk4办公区 - 实用经验教程分享!

    LINK p;Sk4办公区 - 实用经验教程分享!

    for (i=0;istacktop;i )Sk4办公区 - 实用经验教程分享!

    free(stack);Sk4办公区 - 实用经验教程分享!

    while /*designde by 1wangxiaobo@163.com*/(queue) {Sk4办公区 - 实用经验教程分享!

    p=queue;Sk4办公区 - 实用经验教程分享!

    free(p->node);Sk4办公区 - 实用经验教程分享!

    queue=queue->next;Sk4办公区 - 实用经验教程分享!

    free(p);Sk4办公区 - 实用经验教程分享!

    }Sk4办公区 - 实用经验教程分享!

    }Sk4办公区 - 实用经验教程分享!

    Sk4办公区 - 实用经验教程分享!

    // 估价函数,估价 x,y 到目的地的距离,估计值必须保证比实际值小Sk4办公区 - 实用经验教程分享!

    int judge(int x,int y)Sk4办公区 - 实用经验教程分享!

    {Sk4办公区 - 实用经验教程分享!

    int distance;Sk4办公区 - 实用经验教程分享!

    distance=abs(end_x-x) abs(end_y-y);Sk4办公区 - 实用经验教程分享!

    return distance;Sk4办公区 - 实用经验教程分享!

    }Sk4办公区 - 实用经验教程分享!

    Sk4办公区 - 实用经验教程分享!

    // 尝试下一步移动到 x,y 可行否Sk4办公区 - 实用经验教程分享!

    int trytile(int/*designde by 1wangxiaobo@163.com*/ x,int y,TREE father)Sk4办公区 - 实用经验教程分享!

    {Sk4办公区 - 实用经验教程分享!

    TREE p=father;Sk4办公区 - 实用经验教程分享!

    int h;Sk4办公区 - 实用经验教程分享!

    if (map[y][x]=='x') return 1; // 如果 (x,y) 处是障碍,失败Sk4办公区 - 实用经验教程分享!

    while (p) {Sk4办公区 - 实用经验教程分享!

    /*designde by 1wangxiaobo@163.com*/if (x==tile_x(p->tile) && y==tile_y(p->tile)) return 1; //如果 (x,y) 曾经经过,失败Sk4办公区 - 实用经验教程分享!

    p=p->father;Sk4办公区 - 实用经验教程分享!

    }Sk4办公区 - 实用经验教程分享!

    h=father->h 1;Sk4办公区 - 实用经验教程分享!

    if (h>=dis_map[y][x]) return 1;// 如果曾经有更好的方案移动到 (x,y) 失败Sk4办公区 - 实用经验教程分享!

    dis_map[y][x]=h;// 记录这次到 (x,y) 的距离为历史最佳距离Sk4办公区 - 实用经验教程分享!

    Sk4办公区 - 实用经验教程分享!

    // 将这步方案记入待处理队列Sk4办公区 - 实用经验教程分享!

    p=(TREE)malloc(sizeof(*p));Sk4办公区 - 实用经验教程分享!

    p->father=father;Sk4办公区 - 实用经验教程分享!

    p->h=father->h 1;Sk4办公区 - 实用经验教程分享!

    p->tile=tile_num(x,y);Sk4办公区 - 实用经验教程分享!

    enter_queue(p,p->h judge(x,y));Sk4办公区 - 实用经验教程分享!

    return 0;Sk4办公区 - 实用经验教程分享!

    }Sk4办公区 - 实用经验教程分享!

    Sk4办公区 - 实用经验教程分享!

    // 路径寻找主函数Sk4办公区 - 实用经验教程分享!

    void findpath(int *path)Sk4办公区 - 实用经验教程分享!

    {Sk4办公区 - 实用经验教程分享!

    //printf("%d,%d,%d,%d",start_x,start_y,end_x,end_y);Sk4办公区 - 实用经验教程分享!

    TREE root;Sk4办公区 - 实用经验教程分享!

    int i,j;Sk4办公区 - 实用经验教程分享!

    stacktop=0;Sk4办公区 - 实用经验教程分享!

    for (i=0;imap_h;i )Sk4办公区 - 实用经验教程分享!

    for (j=0;jmap_w;j )Sk4办公区 - 实用经验教程分享!

    dis_map[i][j/*designde by 1wangxiaobo@163.com*/]=MAXINT;Sk4办公区 - 实用经验教程分享!

    init_queue();Sk4办公区 - 实用经验教程分享!

    root=(TREE)malloc(sizeof(*root));Sk4办公区 - 实用经验教程分享!

    root->tile=tile_num(start_x,start_y);Sk4办公区 - 实用经验教程分享!

    root->h=0;Sk4办公区 - 实用经验教程分享!

    root->father=NULL;Sk4办公区 - 实用经验教程分享!

    enter_queue(root,judge(start_x,start_y));Sk4办公区 - 实用经验教程分享!

    for (;;) {Sk4办公区 - 实用经验教程分享!

    int x,y,child;Sk4办公区 - 实用经验教程分享!

    TREE p;Sk4办公区 - 实用经验教程分享!

    root=get_from_queue();Sk4办公区 - 实用经验教程分享!

    if (root==NULL) {Sk4办公区 - 实用经验教程分享!

    *path=-1;Sk4办公区 - 实用经验教程分享!

    return;Sk4办公区 - 实用经验教程分享!

    }Sk4办公区 - 实用经验教程分享!

    x=tile_x(root->tile);Sk4办公区 - 实用经验教程分享!

    y=tile_y(root->tile);Sk4办公区 - 实用经验教程分享!

    if (x==end_x && y==end_y) break;// 达到目的地成功返回Sk4办公区 - 实用经验教程分享!

    Sk4办公区 - 实用经验教程分享!

    child=trytile(x,y-1,root);//尝试向上移动Sk4办公区 - 实用经验教程分享!

    child&=trytile(x,y 1,root);//尝试向下移动Sk4办公区 - 实用经验教程分享!

    child&=trytile(x-1,y,root);//尝试向左移动Sk4办公区 - 实用经验教程分享!

    child&=trytile(x 1,y,root);//尝试向右移动Sk4办公区 - 实用经验教程分享!

    if (child!=0)Sk4办公区 - 实用经验教程分享!

    pop_stack();// 如果四个方向均不能移动,释放这个死节点Sk4办公区 - 实用经验教程分享!

    }Sk4办公区 - 实用经验教程分享!

    Sk4办公区 - 实用经验教程分享!

    // 回溯树,将求出的最佳路径保存在 path[] 中Sk4办公区 - 实用经验教程分享!

    for (i=0;root;i ) {Sk4办公区 - 实用经验教程分享!

    path[i]=root->tile;Sk4办公区 - 实用经验教程分享!

    root=root->father;Sk4办公区 - 实用经验教程分享!

    //printf("pathis %d",path[i]/*designde by 1wangxiaobo@163.com*/);Sk4办公区 - 实用经验教程分享!

    }Sk4办公区 - 实用经验教程分享!

    Sk4办公区 - 实用经验教程分享!

    path[i]=-1;Sk4办公区 - 实用经验教程分享!

    freetree();Sk4办公区 - 实用经验教程分享!

    }Sk4办公区 - 实用经验教程分享!

    Sk4办公区 - 实用经验教程分享!

    void printpath(int *path)Sk4办公区 - 实用经验教程分享!

    {Sk4办公区 - 实用经验教程分享!

    int i;Sk4办公区 - 实用经验教程分享!

    //printf("-44444444444444");Sk4办公区 - 实用经验教程分享!

    for (i=0;path[i]>=0;i ) {Sk4办公区 - 实用经验教程分享!

    Sk4办公区 - 实用经验教程分享!

    gotoxy(tile_x(path[i]) 1,tile_y(path[i]) 1);Sk4办公区 - 实用经验教程分享!

    printf("-");Sk4办公区 - 实用经验教程分享!

    Sleep(2000); Sk4办公区 - 实用经验教程分享!

    }Sk4办公区 - 实用经验教程分享!

    printf("\n");Sk4办公区 - 实用经验教程分享!

    printf("\n");Sk4办公区 - 实用经验教程分享!

    printf("走迷宫完成");Sk4办公区 - 实用经验教程分享!

    }Sk4办公区 - 实用经验教程分享!

    Sk4办公区 - 实用经验教程分享!

    Sk4办公区 - 实用经验教程分享!

    Sk4办公区 - 实用经验教程分享!

    void readmap()Sk4办公区 - 实用经验教程分享!

    { printf("走迷宫,s是起始点 e是终点 按任意键开始");Sk4办公区 - 实用经验教程分享!

    getchar();Sk4办公区 - 实用经验教程分享!

    //FILE *f;Sk4办公区 - 实用经验教程分享!

    int i,j;Sk4办公区 - 实用经验教程分享!

    //f=fopen("2.c","r");Sk4办公区 - 实用经验教程分享!

    //assert(f);Sk4办公区 - 实用经验教程分享!

    //scanf("%d%d",&map_w,&map_h);Sk4办公区 - 实用经验教程分享!

    map_w=map_h=6;Sk4办公区 - 实用经验教程分享!

    for (i=0;imap_h;i )Sk4办公区 - 实用经验教程分享!

    //fgets(&map[i][0],map_w 1,f);Sk4办公区 - 实用经验教程分享!

    //fclose(f);Sk4办公区 - 实用经验教程分享!

    Sk4办公区 - 实用经验教程分享!

    Sk4办公区 - 实用经验教程分享!

    start_x=-1,end_x=-1;Sk4办公区 - 实用经验教程分享!

    for (i=0;imap_h;i )Sk4办公区 - 实用经验教程分享!

    for (j=0;j/*designde by 1wangxiaobo@163.com*/map_w;j ) {Sk4办公区 - 实用经验教程分享!

    if (map[i][j]=='s') map[i][j]=' ',start_x=j,start_y=i;Sk4办公区 - 实用经验教程分享!

    if (map[i][j]=='e') map[i][j]=' ',end_x=j,end_y=i;Sk4办公区 - 实用经验教程分享!

    }Sk4办公区 - 实用经验教程分享!

    assert(start_x>=0 && end_x>=0);Sk4办公区 - 实用经验教程分享!

    //printf("%d,%d,%d,%d",start_x,start_y,end_x,end_y);Sk4办公区 - 实用经验教程分享!

    Sk4办公区 - 实用经验教程分享!

    }Sk4办公区 - 实用经验教程分享!

    Sk4办公区 - 实用经验教程分享!

    void showmap()Sk4办公区 - 实用经验教程分享!

    {Sk4办公区 - 实用经验教程分享!

    int i,j;Sk4办公区 - 实用经验教程分享!

    system("cls");Sk4办公区 - 实用经验教程分享!

    for (i=0;imap_h;i ) {Sk4办公区 - 实用经验教程分享!

    gotoxy(1,i 1);Sk4办公区 - 实用经验教程分享!

    for (j=0;jmap_w;j )Sk4办公区 - 实用经验教程分享!

    if (map[i][j]!=' ') printf("x");Sk4办公区 - 实用经验教程分享!

    else printf(" ");Sk4办公区 - 实用经验教程分享!

    }Sk4办公区 - 实用经验教程分享!

    Sk4办公区 - 实用经验教程分享!

    gotoxy(end_x 1,end_y 1);Sk4办公区 - 实用经验教程分享!

    printf("e");Sk4办公区 - 实用经验教程分享!

    gotoxy(start_x 1,start_y 1);Sk4办公区 - 实用经验教程分享!

    printf("s");Sk4办公区 - 实用经验教程分享!

    Sk4办公区 - 实用经验教程分享!

    }Sk4办公区 - 实用经验教程分享!

    Sk4办公区 - 实用经验教程分享!

    int main()Sk4办公区 - 实用经验教程分享!

    {Sk4办公区 - 实用经验教程分享!

    system("title 晓博 A*算法试验程序");//设置cmd窗口标题Sk4办公区 - 实用经验教程分享!

    printf("…………欢迎使用晓博 A*算法试验程序,Designed by 1wangxiaobo@163.com 河南财经政法大学…………");Sk4办公区 - 实用经验教程分享!

    int path[MAXINT];Sk4办公区 - 实用经验教程分享!

    readmap();Sk4办公区 - 实用经验教程分享!

    showmap();Sk4办公区 - 实用经验教程分享!

    Sleep(2000);Sk4办公区 - 实用经验教程分享!

    findpath(path);Sk4办公区 - 实用经验教程分享!

    printpath(path);Sk4办公区 - 实用经验教程分享!

    getchar();Sk4办公区 - 实用经验教程分享!

    system("pause");Sk4办公区 - 实用经验教程分享!

    return 0;Sk4办公区 - 实用经验教程分享!

    }Sk4办公区 - 实用经验教程分享!

  • 注意事项

    • 为了使的程序可以慢慢的打印出来动态的运行效果 加了Sleep(2000);Sk4办公区 - 实用经验教程分享!

    (共篇)

    以上方法由办公区教程网编辑摘抄自百度经验可供大家参考!Sk4办公区 - 实用经验教程分享!


    标签: C语言

    办公区 Copyright © 2016-2023 www.bgqu.net. Some Rights Reserved. 备案号:湘ICP备2020019561号统计代码