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的实现方式,于是我估摸着这个转接板只是一个普通的 ...
随机推荐
- uva301 - Transportation
Transportation Ruratania is just entering capitalism and is establishing new enterprising activiti ...
- U8记账凭证修改方法汇总
在输入记账凭证时,尽管账务系统提供了多种控制错误的措施,但错误凭证的出现是难免的,为此,系统必须能够提供对错误凭证修改的功能.目前,许多财 务软件(如:用友.安易.三门)都提供了“反审核.反记账.反结 ...
- Codeforces Round #290 (Div. 2) A. Fox And Snake 水题
A. Fox And Snake 题目连接: http://codeforces.com/contest/510/problem/A Description Fox Ciel starts to le ...
- [终极精简版][图解]Nginx搭建flv mp4流媒体服务器
花了我接近3周,历经了重重问题,今日终于把流媒体服务器搞定,赶紧的写个博文以免忘记... 起初是跟着网上的一些教程来的,但是说的很不全面,一些东西也过时不用了(比如jwplayer老版本).我这次是用 ...
- C 语言指针怎么理解?
对于程序员来说内存可以简化成这样一种东西:<img src="https://pic1.zhimg.com/4d060c3f67c22cd4b07273db00f64708_b ...
- Ubuntu Nginx搭建Gitweb服务器
安装Nginx 和 Gitweb simba@simba-laptop:~$ sudo apt-get install nginx gitweb 修改Gitweb配置文件 simba@simb ...
- KFC数据测试hbase结果
两个field,一个是KFC数据 一个列放的内容是“same” 每条数据都flush SLF4J: Failed to load class "org.slf4j.impl.Static ...
- Java再学习——sleep(), wait(), notify(), notifyAll()
首先一点就是Thread.sleep(long millis)方法是Thread类的静态方法,其他三个wait(), notify()和notifyAll()都是Object类的方法. sleep(l ...
- AliasRegistry接口
Spring - 4.2.3 // 将一个name注册为一个别名aliasvoid registerAlias(String name, String alias);// 移除一个别名aliasvoi ...
- PostgreSQL异步客户端(并模拟redis 数据结构)
以前为了不在游戏逻辑(对象属性)变更时修改数据库,就弄了个varchar字段来表示json,由服务器逻辑(读取到内存)去操作它. 但这对运维相当不友好,也不能做一些此Json数据里查询. 所以后面就用 ...