扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
在上篇
以下是引用片段: 1 using System; 2 using System.Drawing; 3 using System.Collections.Generic; 4 5 namespace Skyiv.Ben.PushBox.Common 6 { 7 /// 8 /// 寻找最短路线 9 /// 10 static class FindPath 11 { 12 static Size[] offsets = { new Size(0, 1), new Size(1, 0), new Size(0, -1), new Size(-1, 0) }; 13 static Direction[] directions = { Direction.South, Direction.East, Direction.North, Direction.West }; 14 15 /// 16 /// 寻找最短路线 17 /// 18 /// 地图 19 /// 出发点 20 /// 目的地 21 /// 最短路线 22 public static Queue Seek(byte[,] map, Point from, Point to) 23 { 24 Queue moveQueue = new Queue(); // 路线 25 int value; // 与离目的地距离相关的一个量,变化规律: => 2 => 1 => 3 => 2 => 1 => 3 => 2 => 1 26 if (Seek(map, to, out value)) // 找到了一条路线 27 { 28 Point here = from; // 出发点(即工人的位置) 29 Point nbr = new Point(); // 四周的邻居 30 for (value = (value + 1) % 3 + 1; here != to; value = (value + 1) % 3 + 1) // 逐步走向目的地 31 { 32 for (int i = 0; i < offsets.Length; i++) 33 { 34 nbr = Fcl.Add(here, offsets[i]); // 开始寻找四周的邻居 35 if (Block.Value(map[nbr.Y, nbr.X]) == value) // 就往这个方向走 36 { 37 moveQueue.Enqueue(directions[i]); // 路线向目的地延伸一步 38 break; 39 } 40 } 41 here = nbr; // 继续前进 42 } 43 } 44 Block.CleanAllMark(map); // 清除所有标志,恢复现场 45 return moveQueue; // 所寻找的路线,如果无法到达目的地则为该路线的长度为零 46 } 47 48 /// 49 /// 寻找最短路线,使用广度优先搜索 50 /// 51 /// 地图 52 /// 目的地 53 /// 输出:搜索完成时标记的值 54 /// 是否成功 55 static bool Seek(byte[,] map, Point to, out int value) 56 { 57 Queue q = new Queue(); 58 Block.Mark(ref map[to.Y, to.X], 1); // 从目的地开始往回寻找出发点,目的地标记为1 59 Point nbr = Point.Empty; // 四周的邻居 60 for (; ; ) 61 { 62 value = Block.Value(map[to.Y, to.X]) % 3 + 1; // 与离目的地距离相关的一个量,用作标记,变化规律: 63 for (int i = 0; i < offsets.Length; i++) // 1 => 2 => 3 => 1 => 2 => 3 => 1 => 2 => 3 => 64 { 65 nbr = Fcl.Add(to, offsets[i]); // 开始寻找四周的邻居 66 if (Block.IsMan(map[nbr.Y, nbr.X])) break; // 到达出发点(即工人的位置) 67 if (Block.IsBlank(map[nbr.Y, nbr.X])) // 可以走的路 68 { 69 Block.Mark(ref map[nbr.Y, nbr.X], value); // 标记,防止以后再走这条路 70 q.Enqueue(nbr); // 加入队列,等待以后继续寻找 71 } 72 } 73 if (Block.IsMan(map[nbr.Y, nbr.X])) break; // 到达出发点 74 if (q.Count == 0) return false; // 无法到达出发点 75 to = q.Dequeue(); // 出队,继续寻找,这是广度优先搜索,因为前面已经把四周能够走的路全部加入队列中了. 76 } 77 return true; // 找到一条路线 78 } 79 } 80 } |
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者