a*算法最短路径_最长路径算法

a*算法最短路径_最长路径算法#include#include#include#include#include#defineN1000#defineinf1<<30;usingnamespacestd;/* a星算法,找寻最短路径 算法核心:有两个表open表和close表 将方块添加到open列表中,该列表有最小的和值。且将这个方块称为S吧。 将S从open列表移除,然后添加

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

#include <iostream>
#include <cstdio>
#include <queue>
#include <algorithm>
#include <cmath>
#define N 1000
#define inf 1<<30;
using namespace std;
/*
	a星算法,找寻最短路径
	算法核心:有两个表open表和close表
		将方块添加到open列表中,该列表有最小的和值。且将这个方块称为S吧。
		将S从open列表移除,然后添加S到closed列表中。
		对于与S相邻的每一块可通行的方块T:
		如果T在closed列表中:不管它。
		如果T不在open列表中:添加它然后计算出它的和值。
		如果T已经在open列表中:当我们使用当前生成的路径到达那里时,检查F(指的是和值)是否更小。如果是,更新它的和值和它的前继。

		F = G + H        (G指的是从起点到当前点的距离,而H指的是从当前点到目的点的距离(移动量估算值采用曼哈顿距离方法估算)
*/
int map[6][7];     //0表示是路,1表示有阻碍物
int xstart, ystart, xend, yend;       //(x1,y1)起点,(x2, y2)目的点
int close[6][7];  //0表示不在,1表示在
int n;
void astar(int , int );
bool check(int x, int y);
int panyical(int x, int y);
void print2();

struct point{
	int x, y;
	int f, g, h;
	int prex, prey;   //上一个点的x,y	
	point(int x0, int y0, int g0, int h0)
	{
		x = x0;
		y = y0;
		g = g0;
		h = h0;
		f = g + h;
	}
	point(){
	}
}open[N];
void print1(point);        //逆向反推

void init()
{
	xstart = 3, ystart = 1;   //起点
	xend = 4, yend = 5;   //目的点
	map[4][1] = map[1][3] = map[2][3] = map[3][3] = map[4][3] = 1;   //设置阻隔物
	astar(xstart,ystart);
}

point minfpoint()
{
	int flag;
	int minf = inf;
	for(int t=0; t<n; ++t)
	{
		if(close[open[t].x][open[t].y] == 0 && open[t].f <= minf)
		{
			flag = t;
			minf = open[t].f;
		}
	}
	return open[flag];
}
void update(int x, int y, point &s)
{
	for(int t=0; t<n; ++t)
	{
		if(open[t].x == x && open[t].y == y)         //如果该点已经在open表中存在的话,则更新值
		{
			int k = s.g+1+panyical(x, y);
			if(open[t].f > k)
			{
				open[t].f = k;
				open[t].prex = s.x;
				open[t].prey = s.y;
			}
			return ;
		}
	}
	open[n] = point(x, y, s.g+1, panyical(x,y));
	open[n].prex = s.x;
	open[n].prey = s.y;
	n++;
}
void astar(int x, int y)
{
	point s = point(x, y, 0, 0);
	n = 0;
	while(1)
	{
		close[s.x][s.y] = 1;
		if(s.x == xend && s.y == yend)
		{
			break;
		}
		if(check(s.x+1, s.y))
		{
			update(s.x+1, s.y, s);	
		}
		if(check(s.x-1, s.y))
		{
			update(s.x-1, s.y, s);
		}
		if(check(s.x, s.y+1))
		{
			update(s.x, s.y+1, s);
		}
		if(check(s.x, s.y-1))
		{
			update(s.x, s.y-1, s);
		}
		s = minfpoint();
	}
	printf("min:%d g:%d h:%d\n", s.f, s.g, s.h); 
	//print1(s);
	print2();
}

void print1(point p)
{
	point s  = p;
	while(1)
	{
		printf("(%d,%d  g:%d, h:%d f:%d)->", s.x, s.y, s.g, s.h, s.f);
		int prex = s.prex;
		int prey = s.prey;
		if(prex == xstart && prey == ystart)
		{
			break;
		}
		for(int t=0; t<n; ++t)
		{
			if(open[t].x == prex && open[t].y == prey)
			{
				s = open[t];
				break;
			}
		}

	}
}
void print2()
{
	for(int t=0; t<n; ++t)
	{
		point s = open[t];
		printf("(%d,%d  g:%d, h:%d f:%d)\n", s.x, s.y, s.g, s.h, s.f);
		
	}
}
int panyical(int x, int y)
{
	return abs(xend-x) + abs(yend-y);
}

bool check(int x, int y){
	if(x<0 || x>5 || y<0 || y>6 || map[x][y]==1 || close[x][y]==1)
	{
		return false;
	}
	return true;
}
int main()
{
	init();
	return 0;
}

运行结果:

a*算法最短路径_最长路径算法

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/185262.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Java数组的初始化大小_对Java接口实现的建议

    Java数组的初始化大小_对Java接口实现的建议**二维数组:**元素是一维数组的数组。格式一:publicclassArrayDemo{publicstaticvoidmain(String[]args){//格式一int[][]arr=newint[3][2];System.out.println(arr);//[[I@1b6d3586System.out.println(arr[0]);//[I@4554617c

    2022年10月9日
    0
  • string.isnotblank_StringUtils

    string.isnotblank_StringUtilsisNotEmpty将空格也作为参数,isNotBlank则排除空格参数StringUtils方法的操作对象是java.lang.String类型的对象,是JDK提供的String类型操作方法的补充,并且是null安全的(即如果输入参数String为null则不会抛出NullPointerException,而是做了相应处理,例如,如果输入为null则返回也是null等除了构造器,StringUtils中一共有130多个方法,并且都是static的,所以我们可以这样调用StringUtils..

    2022年8月12日
    3
  • matlab 汽车振动,基于MatLab的车辆振动响应幅频特性分析

    matlab 汽车振动,基于MatLab的车辆振动响应幅频特性分析【实例简介】利用MatLab-Simulink仿真了不同减振器阻尼系数和不同悬架刚度下车身加速度、悬架动挠度、车轮动载分别对于路面速度激励振动响应的幅频特性,从而为半主动悬架和主动悬架的优化提供必要的理论支持.关于汽车振动与MATLAB的案例,大家都可以下载看看,3Matlab472基于Simulink车辆振动响应幅频特性分析SimulinkAdd2ToWorkspaceSS1/m,…

    2022年10月9日
    0
  • 数仓分层

    000概述数仓分层是数据仓库设计中十分重要的一个环节,优秀的分层设计能够让整个数据体系更容易理解和使用本文的大纲001,介绍数据分层的作用002,分层设计的原则以及介绍一种通用的数据分层设计003,具体案例004,落地实践意见005,思考001,数据分层的作用我们需要一套行之有效的数据组织和管理方法来让我们的数据体系更有序,这就是数据分层。数据分层的好处有①,清晰数据结构:每一…

    2022年4月4日
    102
  • 7折怎么用计算机,美国联想八通道7折好价,海淘Thinkpad X260 笔记本电脑开箱简评(附齐购物到货过程)…

    7折怎么用计算机,美国联想八通道7折好价,海淘Thinkpad X260 笔记本电脑开箱简评(附齐购物到货过程)…美国联想八通道7折好价,海淘ThinkpadX260笔记本电脑开箱简评(附齐购物到货过程)2016-06-0810:30:1896点赞288收藏127评论接上一篇购物过程贴我擦,你有完没完!!!五、转运过程(补齐剩余回国、清关、缴税、到货过程)(一)简要说明电脑到达转运仓库后,会给你绑定的电话发送一条提醒短信。本人在5月12日收到短信通知,本想给大家找找短信,都怪我手太贱已删除,哎。…

    2022年5月24日
    31
  • UART接口控制器

    UART接口控制器主设备与从设备通过总线来进行数据通信,是一个数字系统不可或缺的一部分,本篇讲述一种常见的总线控制器UART串行数据接口,也称为串口。串口的标准一般有,RS-232、RS-422与RS-485标准,我们讲述的是RS-232接口信号。1、接口信号定义RS-232最常见的是9脚接口表1-1:RS-232接口定义在实际的应用中,我们只需要关注两个接口,数据接收(RXD)和数据发送(TXD),而…

    2022年9月14日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号