zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    Quartz.Net 作业调度后台管理系统,基于Extjs
    [备份]EntityFramework
    WebMisSharp升级说明,最新版本1.6.0
    AllPay(欧付宝)支付接口集成
    Paypal Rest Api自定义物流地址(跳过填写物流地址)
    根据IP获取国家
    ViewBag 找不到编译动态表达式所需的一种或多种类型,是否缺少引用?
    Extjs4 DateTimeField,日期时间控件完美版
    IOS Swift 训练
    .Net集成PayPal的Demo
  • 原文地址:https://www.cnblogs.com/Traveller-Leon/p/4960028.html
Copyright © 2011-2022 走看看