无递归 A星寻路算法
整理硬盘的时候,发现我早些年写的A星寻路算法。特放上来,待有缘人拿去,无递归噢,性能那是杠杠的。
码上伺候
public class Node
{
public int X
{
get;
set;
} public int Y
{
get;
set;
} public int G
{
get;
set;
} public int H
{
get;
set;
} public int F
{
get;
set;
} public Node parentNode
{
get;
set;
} public Node(int x, int y, Node parent)
{
this.X = x;
this.Y = y;
this.parentNode = parent;
}
}
Node
public class AStar
{
private int[,] map;
private List<Node> openList;
private List<Node> closeList;
private const int COST_STRAIGHT = ;
private const int COST_DIAGONAL = ;
private int row;
private int column; public AStar(int[,] map, int row, int column)
{
this.map = map;
this.row = row;
this.column = column;
openList = new List<Node>();
closeList = new List<Node>();
} //查找坐标
public int Search(int x1, int y1, int x2, int y2)
{
if (x1 < || x1 >= row || x2 < || x2 >= row || y1 < || y1 >= column || y2 < || y2 >= column)
{
return -;
} if (map[x1,y1] == || map[x2,y2] == )
{
return -;
} Node start = new Node(x1, y1, null);
Node end = new Node(x2, y2, null);
openList.Add(start);
List<Node> resultList = Search(start, end);
if (resultList.Count == )
{
return ;
} foreach (Node node in resultList)
{
map[node.X,node.Y] = -;
} return ;
} private List<Node> Search(Node start, Node end)
{
List<Node> result = new List<Node>();
bool isFind = false;
Node node = null;
openList.Sort(new NodeComparator()); while (openList.Count > )
{
node = openList[];
if (node.X == end.X && node.Y == end.Y)
{
isFind = true;
break;
}
//上
if ((node.Y - ) >= )
{
CheckPath(node.X, node.Y - , node, end, COST_STRAIGHT);
}
//下
if ((node.Y + ) < column)
{
CheckPath(node.X, node.Y + , node, end, COST_STRAIGHT);
}
//左
if ((node.X - ) >= )
{
CheckPath(node.X - , node.Y, node, end, COST_STRAIGHT);
}
//右
if ((node.X + ) < row)
{
CheckPath(node.X + , node.Y, node, end, COST_STRAIGHT);
}
//左上
if ((node.X - ) >= && (node.Y - ) >= )
{
CheckPath(node.X - , node.Y - , node, end, COST_DIAGONAL);
}
//左下
if ((node.X - ) >= && (node.Y + ) < column)
{
CheckPath(node.X - , node.Y + , node, end, COST_DIAGONAL);
}
//右上
if ((node.X + ) < row && (node.Y - ) >= )
{
CheckPath(node.X + , node.Y - , node, end, COST_DIAGONAL);
}
//右下
if ((node.X + ) < row && (node.Y + ) < column)
{
CheckPath(node.X + , node.Y + , node, end, COST_DIAGONAL);
} openList.Remove(node);
closeList.Add(node);
}
if (isFind) {
GetPath(result, node);
} return result;
} private bool CheckPath(int x, int y, Node parentNode, Node end, int cost)
{
Node node = new Node(x, y, parentNode);
if (map[x,y] == )
{
closeList.Add(node);
return false;
}
if (IsListContains(closeList, x, y) != -)
{
return false;
}
int index = -;
if ((index = IsListContains(openList, x, y)) != -)
{
if ((parentNode.G + cost) < openList[index].G)
{
node.parentNode = parentNode;
CountG(node, cost);
CountF(node);
openList[index] = node;
}
}
else {
node.parentNode = parentNode;
Count(node, end, cost);
openList.Add(node);
} return true;
} private int IsListContains(List<Node> list, int x, int y)
{
int i = ;
foreach (Node node in list)
{
if (node.X == x && node.Y == y)
{
return i;
}
i += ;
} return -;
} private void GetPath(List<Node> list, Node node)
{
while (node.parentNode != null)
{
list.Add(node);
node = node.parentNode;
} list.Add(node); } private void Count(Node node, Node end, int cost)
{
CountG(node, cost);
CountH(node, end);
CountF(end);
} private void CountG(Node node, int cost)
{
if (node.parentNode == null)
{
node.G = cost;
}
else
node.G = node.parentNode.G + cost;
} private void CountH(Node node, Node end)
{
node.H = Math.Abs(node.X - end.X) + Math.Abs(node.Y - end.Y);
} private void CountF(Node node)
{
node.F = node.G + node.H;
}
}
AStar
class Program
{
delegate void FuncDelegate(); static void Measure(FuncDelegate func, string funcName)
{
Stopwatch sw = new Stopwatch();
sw.Start();
func();
sw.Stop();
Console.WriteLine(" {0} used {1} ms", funcName, sw.ElapsedMilliseconds);
} static void DrawTheMap(int[,] map)
{
for (int x = ; x < ; x++)
{
for (int y = ; y < ; y++)
{
if (map[x, y] == )
{
Console.Write("□");
}
else if (map[x, y] == )
{
Console.Write("■");
}
else if (map[x, y] == -)
{
Console.Write("※");
}
}
Console.WriteLine("");
}
} static void AstarAlgorim()
{
int[,] map = new int[,] {
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,},
}; AStar star = new AStar(map, , );
int flag = star.Search(, , , );
if (flag == -)
{
Console.WriteLine("传输数据有误!");
}
else if (flag == )
{
Console.WriteLine("没有找到!");
}
else
{
DrawTheMap(map);
}
} static void Main(string[] args)
{
Measure(AstarAlgorim, "A星寻路"); Console.ReadLine();
}
}
Program
无递归 A星寻路算法的更多相关文章
- A星寻路算法
A星寻路算法 1.准备一个close关闭列表(存放已被检索的点),一个open开启列表(存放未被检索的点),一个当前点的对象cur 2.将cur设成开始点 3.从cur起,将cur点放入close表中 ...
- 基于Unity的A星寻路算法(绝对简单完整版本)
前言 在上一篇文章,介绍了网格地图的实现方式,基于该文章,我们来实现一个A星寻路的算法,最终实现的效果为: 项目源码已上传Github:AStarNavigate 在阅读本篇文章,如果你对于里面提到的 ...
- A星寻路算法介绍
你是否在做一款游戏的时候想创造一些怪兽或者游戏主角,让它们移动到特定的位置,避开墙壁和障碍物呢? 如果是的话,请看这篇教程,我们会展示如何使用A星寻路算法来实现它! 在网上已经有很多篇关于A星寻路算法 ...
- cocos2d-x学习日志(13) --A星寻路算法demo
你是否在做一款游戏的时候想创造一些怪兽或者游戏主角,让它们移动到特定的位置,避开墙壁和障碍物呢?如果是的话,请看这篇教程,我们会展示如何使用A星寻路算法来实现它! A星算法简介: A*搜寻算法俗称A星 ...
- A星寻路算法(A* Search Algorithm)
你是否在做一款游戏的时候想创造一些怪兽或者游戏主角,让它们移动到特定的位置,避开墙壁和障碍物呢? 如果是的话,请看这篇教程,我们会展示如何使用A星寻路算法来实现它! 在网上已经有很多篇关于A星寻路算法 ...
- A星寻路算法入门(Unity实现)
最近简单学习了一下A星寻路算法,来记录一下.还是个萌新,如果写的不好,请谅解.Unity版本:2018.3.2f1 A星寻路算法是什么 游戏开发中往往有这样的需求,让玩家控制的角色自动寻路到目标地点, ...
- A星寻路算法-Mind&Hand(C++)
//注1:Mind & Hand,MIT校训,这里指的理解与实现(动脑也动手) //注2:博文分为两部分:(1)理解部分,为参考其他优秀博文的摘要梳理:(2)代码部分,是C++代码实现的,源码 ...
- 【Android】基于A星寻路算法的简单迷宫应用
简介 基于[漫画算法-小灰的算法之旅]上的A星寻路算法,开发的一个Demo.目前实现后退.重新载入.路径提示.地图刷新等功能.没有做太多的性能优化,算是深化对A星寻路算法的理解. 界面预览: 初始化: ...
- [转载]A星寻路算法介绍
转载自:http://www.raywenderlich.com/zh-hans/21503/a%E6%98%9F%E5%AF%BB%E8%B7%AF%E7%AE%97%E6%B3%95%E4%BB% ...
随机推荐
- Java---常用基础面试知识点
综合网上的一点资源,给大家整理了一些Java常用的基础面试知识点,希望能帮助到刚开始学习或正在学习的学员. 1.抽象 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方 ...
- 深度优先搜索-linux上浅显易懂的例子
上次看啊哈算法中的深度优先搜索,自己用的是linux(linux粉,windows黑,嘿嘿),字符界面,为了强化对这个的理解,就在linux上对这个例子的代码做了一点修改可以很清楚的看到整个搜索过程, ...
- String源码
/* * Copyright (c) 1994, 2010, Oracle and/or its affiliates. All rights reserved. * ORACLE PROPRIETA ...
- 获取Android自己写好了的apk以及反编译
今天,我们先说一下,获取Android自带的apk以及反编译它们来学习Android工程师是怎样写的,今天我们就以拿到Android自带的短信管理器的apk为例子 你可能有疑问,为什么要那么麻烦,从系 ...
- [CSS3] CSS Media Queries
Using CSS media queries allows you to design responsive layout in your web apps and website. We will ...
- Tomcat 加入windows 服务自启动设置
基于J2ee技术开发,可以运行在Tomcat.weblogic.websphere等J2ee应用服务器上,对于一般访问量不是很高的客户我们推荐使用Tomcat(开源免费),一般情况下Tomcat服务需 ...
- TP框架多表联查
join方法import("@.ORG.Page"); $Form = M('gly'); $where=''; if ($_PO ...
- 通过URL推送POST数据
由于到了一家新公司重新开始接触MVC和其他的一些东西.所以的重新拾起许多东西. 前一段时间让我写一个和第三方公司推送对接的方法.通过对方提供的URL把数据post推送出去. 我把url到了web.co ...
- HDU3756
题意:给定三围空间里面某些点,求构造出一个棱锥,将所有点包含,并且棱锥的体积最小. 输入: T(测试数据组数) n(给定点的个数) a,b,c(对应xyz坐标值) . . . 输出: H(构造棱锥的高 ...
- JAVA通过url获取页面内容
String address = "http://sports.sina.com.cn/nba/live.html?id=2015050405"; URL url = new UR ...