• A*算法的实现


      1 #include<cstdio>
      2 #include<cstdlib>
      3 #include<cstring>
      4 #include<iostream>
      5 #include<list>
      6 #include<string>
      7 #include<ctime>
      8 #include <algorithm>
      9 #include"jsoncpp/json.h"
     10 using namespace std;
     11 const int n=5;
     12 const int dx[4]={-1,0,1,0};     //up,right,down,left
     13 const int dy[4]={0,1,0,-1};
     14 int invalid[n][n]={
     15 0,1,0,1,0,
     16 0,0,0,1,0,
     17 0,0,0,1,0,
     18 0,1,0,0,0,
     19 0,1,0,1,0
     20 };
     21 int tx=4,ty=0,tx1=4,ty1=4;
     22 
     23 struct point
     24 {
     25     int f,g,h;
     26     int x,y;
     27     point(int _x=0,int _y=0)
     28     {
     29         x=_x;
     30         y=_y;
     31     }
     32 };
     33 
     34 list<point> CloseList;
     35 list<point> OpenList;
     36 point father[100][100];    //记录路径 
     37 
     38 
     39 bool My_validDirection1(int x,int y)  //判断当前移动方向的下一格是否合法
     40 {
     41     if (x>=n || y>=n || x<0 || y<0) return false;
     42     if (invalid[x][y]) return false;
     43     return true;
     44 }
     45 
     46 
     47 int As()
     48 {
     49     point start(tx,ty);
     50     point end(tx1,ty1);
     51     point tempStart(0,0);    //当前点 
     52     
     53     OpenList.push_front(start);
     54     while(OpenList.size()!=0)
     55     {
     56         //选出f最小点作为当前点 
     57         list<point>::iterator it_close=OpenList.begin();
     58         list<point>::iterator it=OpenList.begin();
     59         tempStart=*it;
     60         ++it;
     61         for(;it!=OpenList.end();++it)
     62         {
     63             if((*it).f<tempStart.f)
     64             {
     65                 tempStart=*it;
     66                 it_close=it;
     67             }
     68         }
     69         //将当前点加入关闭列表 
     70         OpenList.erase(it_close);
     71         CloseList.push_front(tempStart);
     72         //周围的点进行扩展 
     73         for(int i=0;i<4;++i)
     74         {
     75             int exist=0,close=0;
     76             point p(tempStart.x+dx[i],tempStart.y+dy[i]);
     77             //如果已经存在关闭列表,则不进行操作 
     78             for(it=CloseList.begin();it!=CloseList.end();++it)
     79             {
     80                 if((*it).x==p.x&&(*it).y==p.y)
     81                 {
     82                     close=1;
     83                     break;
     84                 }
     85             }                    
     86             //如果是非法点或者存在于关闭列表,则不操作 
     87             if(My_validDirection1(p.x,p.y)&&!close)
     88             {
     89                 for(it=OpenList.begin();it!=OpenList.end();++it)
     90                 {
     91                     if((*it).x==p.x&&(*it).y==p.y)
     92                     {
     93                         exist=1;
     94                         break;
     95                     }
     96                 }        
     97                 //如果存在于开启列表,则更新fg        
     98                 if(exist)
     99                 {
    100                     int g=tempStart.g+1;
    101                     if(g>p.g)
    102                     {
    103                         tempStart=point(father[tempStart.x][tempStart.y].x,father[tempStart.x][tempStart.y].y);
    104                         p.g=abs(p.x-tempStart.x)+abs(p.y-tempStart.y);
    105                         p.f=p.g+p.h;
    106                     }
    107                 }
    108                 //否则加入开启列表,计算fgh 
    109                 else
    110                 {
    111                     p.g=abs(p.x-tempStart.x)+abs(p.y-tempStart.y);
    112                     p.h=abs(p.x-tx1)+abs(p.y-ty1);
    113                     p.f=p.g+p.h;
    114                     OpenList.push_front(p);
    115                     father[p.x][p.y]=tempStart;
    116                 }
    117             }
    118         }
    119         //查询目标点是否在开启列表内 
    120         for(it=OpenList.begin();it!=OpenList.end();++it)
    121         {
    122             if((*it).x==tx1&&(*it).y==ty1)
    123             {
    124                 int a=tx1,b=ty1,xx=tx1,yy=ty1;
    125                 while(father[xx][yy].x!=tx||father[xx][yy].y!=ty)
    126                 {
    127                     cout<<xx<<","<<yy<<"<-"    ;            
    128                     a=father[xx][yy].x;
    129                     b=father[xx][yy].y;
    130                     xx=a;yy=b;
    131                 }
    132                 cout<<xx<<","<<yy<<"<-start";
    133                 if(xx==tx)
    134                 {
    135                     if(yy>ty)
    136                     {//r2
    137                         return 1;
    138                     }
    139                     else
    140                     {//l0
    141                         return 3;
    142                     }
    143                 }
    144                 else
    145                 {
    146                     if(xx>tx)
    147                     {//d1
    148                         return 2;
    149                     }
    150                     else
    151                     {//u3
    152                         return 0;
    153                     }                    
    154                 }
    155             }
    156         }            
    157         
    158     }
    159     return -1;
    160 }
    161 //0:left,1:down,2:right,3:up
    162 
    163 int main()
    164 {
    165 
    166     int ans=As();
    167 
    168 //    cout<<ans<<endl;
    169  
    170     return 0;
    171 }
  • 相关阅读:
    注释神器
    Q币直充-迅银渠道商(php 面向对象类)
    rsync 同步多台服务器项目目录
    wdcp 打开网页显示 Apache 2 Test Page powered by CentOS -- 来自辉哥博客
    elasticsearch批量修改,批量更新某个字段
    Ik分词器没有使用---------elasticsearch-analysis-ik 5.6.3分词问题
    spring-boot-starter-data-elasticsearch 整合elasticsearch 5.x详解
    FastJson--SerializerFeature.PrettyFormat 如何实现格式化源码查看
    由Premature end of Content-Length delimited message body因发的问题排查
    JVM的YoungGC日志查看
  • 原文地址:https://www.cnblogs.com/Traveller-Leon/p/4960028.html
Copyright © 2020-2023  润新知