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的实现方式,于是我估摸着这个转接板只是一个普通的 ...
随机推荐
- udt nat traverse
https://github.com/bakwc/udt-nat-traverse Example of nat traversal using udt library. UDT is a udp b ...
- NAT类型与穿透 及 STUN TURN 协议
STUN : Simple Traversal of User Datagram Protocol [UDP] Through Network Address Translators [NATs] S ...
- SpringAOP 基础具体解释
Spring AOP对于刚開始学习spring的同学来说有点难以理解.我刚工作的时候都没怎么理解,如今略微理解了一点,所以在这里我将用嘴简单的样例,最通俗易懂的话语来说出我的理解,可能因为我对Spri ...
- Cocos2D-x权威指南:通过节点控制屏幕中的全体渲染对象
本节,已经能够利用我们眼下所学的知识做出一些有趣的东西.之前已经说过,CCNode类没有贴图,也就是说在屏幕上单独建立一个节点是没有不论什么效果的,可是能够通过这个"无形"的节点来 ...
- Hello_IOS ios开发transform属性
#import "ViewController.h" @interface ViewController () @property (weak, nonatomic) IBOutl ...
- 深入了解android平台的jni---本地多线程调用java代码
一.jni调用java对象 JNI提供的功能之一是在本地代码中使用Java对象.包括:创建一个java类对象和通过函数传递一个java对象.创建一个java类对象,首先需要得到得到使用Find ...
- Linux内核学习笔记
1.vanbreaker的专栏 2.LinuxKernel Exploration 3.DroidPhone的专栏 4.Linux内核研究以及学习文档和ARM学习以及研究的开放文档 [力荐] 5. ...
- linxu,window系统
window下:net start VMwareHostdVMAuthdServiceVMUSBArbService"VMware NAT Service"VMnetDHCP #启 ...
- 用 Gearman 分发 PHP 应用程序的工作负载
尽管一个 Web 应用程序的大部分内容都与表示有关,但它的价值与竞争优势却可能体现在若干专有服务或算法方面.如果这类处理过于复杂或拖沓,最好是进行异步执行,以免 Web 服务器对传入的请求没有响应.实 ...
- 第一个c++程序 helloworld
// helloworld.cpp : 定义控制台应用程序的入口点.// #include "stdafx.h"#include "iostream" int ...