无递归 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% ...
随机推荐
- Oracle分页查询与RowNum
1. RowNum伪列 Oracle中,RowNum是一个伪列,表示当前记录是查询结果集中的第几条. RowNum在使用上应该注意,不能在where条件中用RowNum大于.大于等于.等于某个大于1的 ...
- [Java] Java 技术和 JVM 基础
Java 由 Sun 公司在 1995 首次发布,既是一门编程语言,也是一个计算平台. Java 运行时版本 Java Runtime Edition 当你下载 Java 完时候,你会得到一个 Jav ...
- [转载]Android开发必备的21个免费资源和工具
转载自: http://blog.csdn.net/shimiso/article/details/6788375 Android移动开发平台现在不是一个“火”字能形容的,今年Android平台在市场 ...
- 解决NoSuchMethodError with Spring MutableValues异常问题
今天下午项目启动时,遇到一个异常,导致无法启动: [ 221] ERROR - work.web.context.ContextLoader - Context initialization fail ...
- HDU3631:Shortest Path(Floyd)
Problem Description When YY was a boy and LMY was a girl, they trained for NOI (National Olympiad in ...
- Reachability下载地址
https://developer.apple.com/library/ios/samplecode/Reachability/Introduction/Intro.html
- [转] GPS坐标转换经纬度及换算方法
GPS坐标和经纬度的算法和概率不太一样,但是我们可能会将他们互通起来用,下面先贴上我做的转换工具:http://map.yanue.net/gps.html.里面实现了gps到谷歌地图百度地图经纬度的 ...
- Java基础知识强化28:Scanner类之Scanner类的概述
1.Scanner概述: JDK5以后用于获取用户的键盘输入 2.Scanner的构造方法: public Scanner (InputStream source) ...
- linux常见设备类型及文件系统
As you can see in Table 14.3 , all disk device names end with the letter a. That is because it ...
- Linux系统最小化安装之后的系统基础环境安装以及内核优化脚本
#!/bin/bash #添加epel和rpmforge的外部yum扩展源 cd /usr/local/src wget http://mirrors.ustc.edu.cn/fedora/epel/ ...