A*算法的实现
#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*算法的实现的更多相关文章
- Bug2算法的实现(RobotBASIC环境中仿真)
移动机器人智能的一个重要标志就是自主导航,而实现机器人自主导航有个基本要求--避障.之前简单介绍过Bug避障算法,但仅仅了解大致理论而不亲自动手实现一遍很难有深刻的印象,只能说似懂非懂.我不是天才,不 ...
- Canny边缘检测算法的实现
图像边缘信息主要集中在高频段,通常说图像锐化或检测边缘,实质就是高频滤波.我们知道微分运算是求信号的变化率,具有加强高频分量的作用.在空域运算中来说,对图像的锐化就是计算微分.由于数字图像的离散信号, ...
- java基础解析系列(四)---LinkedHashMap的原理及LRU算法的实现
java基础解析系列(四)---LinkedHashMap的原理及LRU算法的实现 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析 ...
- SSE图像算法优化系列十三:超高速BoxBlur算法的实现和优化(Opencv的速度的五倍)
在SSE图像算法优化系列五:超高速指数模糊算法的实现和优化(10000*10000在100ms左右实现) 一文中,我曾经说过优化后的ExpBlur比BoxBlur还要快,那个时候我比较的BoxBlur ...
- 详解Linux内核红黑树算法的实现
转自:https://blog.csdn.net/npy_lp/article/details/7420689 内核源码:linux-2.6.38.8.tar.bz2 关于二叉查找树的概念请参考博文& ...
- 详细MATLAB 中BP神经网络算法的实现
MATLAB 中BP神经网络算法的实现 BP神经网络算法提供了一种普遍并且实用的方法从样例中学习值为实数.离散值或者向量的函数,这里就简单介绍一下如何用MATLAB编程实现该算法. 具体步骤 这里 ...
- Python学习(三) 八大排序算法的实现(下)
本文Python实现了插入排序.基数排序.希尔排序.冒泡排序.高速排序.直接选择排序.堆排序.归并排序的后面四种. 上篇:Python学习(三) 八大排序算法的实现(上) 1.高速排序 描写叙述 通过 ...
- C++基础代码--20余种数据结构和算法的实现
C++基础代码--20余种数据结构和算法的实现 过年了,闲来无事,翻阅起以前写的代码,无意间找到了大学时写的一套C++工具集,主要是关于数据结构和算法.以及语言层面的工具类.过去好几年了,现在几乎已经 ...
- Python八大算法的实现,插入排序、希尔排序、冒泡排序、快速排序、直接选择排序、堆排序、归并排序、基数排序。
Python八大算法的实现,插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得 ...
- 基于思岚A1激光雷达+OpenGL+VS2017的Ramer-Douglas-Peucker算法的实现
时隔两年 又借到了之前的那个激光雷达,最老版本的思岚A1,甚至不支持新的固件,并且转接板也不见了,看了下淘宝店卖¥80,但是官方提供了一个基于STM32的实现方式,于是我估摸着这个转接板只是一个普通的 ...
随机推荐
- atprogram.exe : Atmel Studio Command Line Interface
C:\Program Files\Atmel\Atmel Studio 6.1\atbackend\atprogram.exe No command specified.Atmel Studio Co ...
- 测试HAPROXY的文件分流办法
测试HAPROXY的文件分流办法 http://blog.chinaunix.net/uid-20553497-id-3054980.html http://blog.sina.com.cn/s/bl ...
- ecmall widgets 挂件开发详解
Ecmall挂件开发 实质上是后台开发很多页面,分别去调用程序展示这些页面,达到首页内容更换很快的目的,这样做减少后续开发,开发人员只需开发挂件就可以了,至于位置可随意定.(还需调整html,但是起码 ...
- html页面head区域的编码书写规范
今天我们简单的介绍一下head区域主要放置了内容.这里就不强调css和javascript了,这两者是大家所熟知的. head区一般必须加入的标识有: 公司版权注释 <!--- the site ...
- 【JavaScript】关于js的一些理解
嵌套函数即作用域链:嵌套函数即闭包 函数表达式即延迟执行 匿名函数----------->实现块级作用域 call会切换到调用的对象参数环境.
- Browser 與 Server 持續同步的作法介紹 (Polling, Comet, Long Polling, WebSocket)长连接
對 Comet 的懵懂 記得兩年多前,第一次看到 Gmail 中的 GTalk 覺得很好奇:「咦?線上聊天且是 Google 的熱門系統,只用傳統的 AJAX 應該會操爆伺服器吧?」很幸運的,當時前公 ...
- oc-14-对象方法调用类方法
Person.h #import <Foundation/Foundation.h> @interface Person : NSObject { @public int _age; fl ...
- 词法分析器Demo
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Lexe ...
- (文件描述符0、1、2),(stdin、stdout、stderr),(终端设备)这三者之间的关系???
前言 在Linux系统中,一切设备都看作文件.而每打开一个文件,就有一个代表该打开文件的文件描述符.程序启动时默认打开三个I/O设备文件:标准输入文件stdin,标准输出文件stdout,标准错误输出 ...
- ProgressBar的Indeterminate属性
Indeterminate ProgressBar默认是白色的,如果容器的背景也是白色的,这样就根本看不到Progressbar. 简单解决方案: 用style属性设定反转的颜色. <Progr ...