题目如下:
文章地址:http://www.byteedu.com/thread-763-1-1.html
A*算法--罗马尼亚度假问题问题表述
利用A*算法找到从A城市到B城市的最短路径,以及代价,其中A*算法中的h也就是从当前点到目标点的距离已经给出。
要求:
1. Go语言实现
2. 测试结果截个图
3. 支持原创
奖励:
1. 第一名回答的奖励:威望:5000 ,金币:50,书一本:深入浅出Prometheus(邮费中奖者承担,邮寄方式:到付)
2. 第二名回答的奖励:威望:5000 ,金币:50
3. 第三名回答的奖励:威望:5000 ,金币:30
注:
同时本片文章截稿后,会在Golang语言社区公众平台推送,文章形式原创,且打赏获得的酬劳归前三名所有,比例:50%,30%,20%
ByteEdu教育平台会员 :Tears 解答 如下
代码:
https://github.com/HuiguoRose/aStar/
效果:
部分代码:
1package main
2
3import (
4 "math/rand"
5 "time"
6)
7
8type PointMap struct {
9 Size int // 大小
10 Obstacle int //障碍物
11 ObstaclePoint []*Point
12}
13
14func NewPointMap(size int) *PointMap {
15 //设置障碍物的数量为地图大小除以8
16 randomMap := &PointMap{Size: size, Obstacle: size / 8}
17 //调用GenerateObstacle生成随机障碍物;
18 randomMap.GenerateObstacle()
19 return randomMap
20}
21
22func (pm *PointMap) GenerateObstacle() {
23 pm.ObstaclePoint = append(pm.ObstaclePoint, NewPoint(pm.Size/2, pm.Size/2))
24 pm.ObstaclePoint = append(pm.ObstaclePoint, NewPoint(pm.Size/2, pm.Size/2-1))
25 //在地图的中间生成一个斜着的障碍物;
26 x := make([]int, 4)
27 for i := range x {
28 v := pm.Size/2 - 4 + i
29 pm.ObstaclePoint = append(pm.ObstaclePoint, NewPoint(v, pm.Size-v))
30 pm.ObstaclePoint = append(pm.ObstaclePoint, NewPoint(v, pm.Size-v-1))
31 pm.ObstaclePoint = append(pm.ObstaclePoint, NewPoint(pm.Size-v, v))
32 pm.ObstaclePoint = append(pm.ObstaclePoint, NewPoint(pm.Size-v, v-1))
33 }
34 //随机生成其他几个障碍物;
35 x = make([]int, pm.Obstacle-1)
36 for range x {
37 rand.Seed(time.Now().UnixNano())
38 x := rand.Intn(pm.Size)
39 y := rand.Intn(pm.Size)
40 pm.ObstaclePoint = append(pm.ObstaclePoint, NewPoint(x, y))
41 //障碍物的方向也是随机的;
42 xl := make([]int, pm.Size/4)
43 randNum := rand.Intn(100)
44 for l := range xl {
45 if randNum > 50 {
46 pm.ObstaclePoint = append(pm.ObstaclePoint, NewPoint(x, y+l))
47 } else {
48 pm.ObstaclePoint = append(pm.ObstaclePoint, NewPoint(x+l, y))
49 }
50 }
51 }
52}
53//定义一个方法来判断某个节点是否是障碍物
54func (pm *PointMap) IsObstacle(i, j int) bool {
55 for _, p := range pm.ObstaclePoint {
56 if i == p.X && j == p.Y {
57 return true
58 }
59 }
60 return false
61}