#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<list>
#include<string>
#include<ctime>
#include <algorithm>
#include"jsoncpp/json.h"
using namespace std;
const int n=;
const int dx[]={-,,,}; //up,right,down,left
const int dy[]={,,,-};
int invalid[n][n]={
,,,,,
,,,,,
,,,,,
,,,,,
,,,,
};
int tx=,ty=,tx1=,ty1=; struct point
{
int f,g,h;
int x,y;
point(int _x=,int _y=)
{
x=_x;
y=_y;
}
}; list<point> CloseList;
list<point> OpenList;
point father[][]; //记录路径 bool My_validDirection1(int x,int y) //判断当前移动方向的下一格是否合法
{
if (x>=n || y>=n || x< || y<) return false;
if (invalid[x][y]) return false;
return true;
} int As()
{
point start(tx,ty);
point end(tx1,ty1);
point tempStart(,); //当前点 OpenList.push_front(start);
while(OpenList.size()!=)
{
//选出f最小点作为当前点
list<point>::iterator it_close=OpenList.begin();
list<point>::iterator it=OpenList.begin();
tempStart=*it;
++it;
for(;it!=OpenList.end();++it)
{
if((*it).f<tempStart.f)
{
tempStart=*it;
it_close=it;
}
}
//将当前点加入关闭列表
OpenList.erase(it_close);
CloseList.push_front(tempStart);
//周围的点进行扩展
for(int i=;i<;++i)
{
int exist=,close=;
point p(tempStart.x+dx[i],tempStart.y+dy[i]);
//如果已经存在关闭列表,则不进行操作
for(it=CloseList.begin();it!=CloseList.end();++it)
{
if((*it).x==p.x&&(*it).y==p.y)
{
close=;
break;
}
}
//如果是非法点或者存在于关闭列表,则不操作
if(My_validDirection1(p.x,p.y)&&!close)
{
for(it=OpenList.begin();it!=OpenList.end();++it)
{
if((*it).x==p.x&&(*it).y==p.y)
{
exist=;
break;
}
}
//如果存在于开启列表,则更新fg
if(exist)
{
int g=tempStart.g+;
if(g>p.g)
{
tempStart=point(father[tempStart.x][tempStart.y].x,father[tempStart.x][tempStart.y].y);
p.g=abs(p.x-tempStart.x)+abs(p.y-tempStart.y);
p.f=p.g+p.h;
}
}
//否则加入开启列表,计算fgh
else
{
p.g=abs(p.x-tempStart.x)+abs(p.y-tempStart.y);
p.h=abs(p.x-tx1)+abs(p.y-ty1);
p.f=p.g+p.h;
OpenList.push_front(p);
father[p.x][p.y]=tempStart;
}
}
}
//查询目标点是否在开启列表内
for(it=OpenList.begin();it!=OpenList.end();++it)
{
if((*it).x==tx1&&(*it).y==ty1)
{
int a=tx1,b=ty1,xx=tx1,yy=ty1;
while(father[xx][yy].x!=tx||father[xx][yy].y!=ty)
{
cout<<xx<<","<<yy<<"<-" ;
a=father[xx][yy].x;
b=father[xx][yy].y;
xx=a;yy=b;
}
cout<<xx<<","<<yy<<"<-start";
if(xx==tx)
{
if(yy>ty)
{//r2
return ;
}
else
{//l0
return ;
}
}
else
{
if(xx>tx)
{//d1
return ;
}
else
{//u3
return ;
}
}
}
} }
return -;
}
//0:left,1:down,2:right,3:up int main()
{ int ans=As(); // cout<<ans<<endl; return ;
}

A*算法的实现的更多相关文章

  1. Bug2算法的实现(RobotBASIC环境中仿真)

    移动机器人智能的一个重要标志就是自主导航,而实现机器人自主导航有个基本要求--避障.之前简单介绍过Bug避障算法,但仅仅了解大致理论而不亲自动手实现一遍很难有深刻的印象,只能说似懂非懂.我不是天才,不 ...

  2. Canny边缘检测算法的实现

    图像边缘信息主要集中在高频段,通常说图像锐化或检测边缘,实质就是高频滤波.我们知道微分运算是求信号的变化率,具有加强高频分量的作用.在空域运算中来说,对图像的锐化就是计算微分.由于数字图像的离散信号, ...

  3. java基础解析系列(四)---LinkedHashMap的原理及LRU算法的实现

    java基础解析系列(四)---LinkedHashMap的原理及LRU算法的实现 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析 ...

  4. SSE图像算法优化系列十三:超高速BoxBlur算法的实现和优化(Opencv的速度的五倍)

    在SSE图像算法优化系列五:超高速指数模糊算法的实现和优化(10000*10000在100ms左右实现) 一文中,我曾经说过优化后的ExpBlur比BoxBlur还要快,那个时候我比较的BoxBlur ...

  5. 详解Linux内核红黑树算法的实现

    转自:https://blog.csdn.net/npy_lp/article/details/7420689 内核源码:linux-2.6.38.8.tar.bz2 关于二叉查找树的概念请参考博文& ...

  6. 详细MATLAB 中BP神经网络算法的实现

    MATLAB 中BP神经网络算法的实现 BP神经网络算法提供了一种普遍并且实用的方法从样例中学习值为实数.离散值或者向量的函数,这里就简单介绍一下如何用MATLAB编程实现该算法. 具体步骤   这里 ...

  7. Python学习(三) 八大排序算法的实现(下)

    本文Python实现了插入排序.基数排序.希尔排序.冒泡排序.高速排序.直接选择排序.堆排序.归并排序的后面四种. 上篇:Python学习(三) 八大排序算法的实现(上) 1.高速排序 描写叙述 通过 ...

  8. C++基础代码--20余种数据结构和算法的实现

    C++基础代码--20余种数据结构和算法的实现 过年了,闲来无事,翻阅起以前写的代码,无意间找到了大学时写的一套C++工具集,主要是关于数据结构和算法.以及语言层面的工具类.过去好几年了,现在几乎已经 ...

  9. Python八大算法的实现,插入排序、希尔排序、冒泡排序、快速排序、直接选择排序、堆排序、归并排序、基数排序。

    Python八大算法的实现,插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得 ...

  10. 基于思岚A1激光雷达+OpenGL+VS2017的Ramer-Douglas-Peucker算法的实现

    时隔两年 又借到了之前的那个激光雷达,最老版本的思岚A1,甚至不支持新的固件,并且转接板也不见了,看了下淘宝店卖¥80,但是官方提供了一个基于STM32的实现方式,于是我估摸着这个转接板只是一个普通的 ...

随机推荐

  1. IAR Build from the command line 环境变量设置

    http://supp.iar.com/Support/?Note=47884 Technical Note 47884 Build from the command line The alterna ...

  2. SAP实施方法与过程——ASAP

    ASAP是SAP公司为使R/3项目的实施更简单.更有效的一套完整的快速实施方法.ASAP优化了在实施过程中对时间.质量和资源的有效使用等方面的控制.它是一个包括了使得项目实施得以成功所有基本要素的完整 ...

  3. Android输入输出系统之TouchEvent流程

    一个是InputReader,一个是InputDispatcher.方法是dispatchTouch. 入口点是InputReader 的loopOnce方法. InputReader里面有个线程叫做 ...

  4. 深入了解android平台的jni---图像灰度化处理

    一.涉及到的jni编程知识 Java基本类型的数组,在JNI中都是jArray的类型格式.具体类型如下: typedef jarray jbooleanArray; typedef jarray jb ...

  5. javascript 拷贝

    拷贝简单分为浅拷贝与深度拷贝,即给定一个对象,生成一个相同的对象. 浅拷贝 function copy(source,destiny){ destiny = destiny || {}; if(typ ...

  6. xcode中没有autoSizing的设置

    转自:http://blog.sina.com.cn/s/blog_954bb2f001016oyx.html 学习Xcode的iOS编程时,可能会发现Autosizing Control不见了,其原 ...

  7. 在使用ICSharpCode.SharpZipLib进行目录压缩后,再解压缩是提示这个错误Size mismatch: 4294967295;126976 70202;126976

    在压缩代码中加入entry.CompressionMethod = CompressionMethod.Stored

  8. C#面向对象(四)虚方法实现多态

    一.虚方法实现多态 1,创建一个people基类 using System; using System.Collections.Generic; using System.Linq; using Sy ...

  9. solr安全-tomcat

    1.1. tomcat部署1 参考文档:solr安全机制 1.1.1. 加上安全机制的必要性 在前面有提到, Solr 本身是不加安全机制的, 所有的查詢.admin.update 這些指令都可以經由 ...

  10. Solr DIH dataconfig配置

    1. 配置文件data-config.xml定义了数据库的基本配置,以及导出数据的映射规则,即导出数据库表中对应哪些字段的值,以及对特定字段的值做如何处理 </pre><p>& ...