二维地图的寻路算法2

该博客探讨了一种二维地图的寻路算法,虽然得到的解可能非最优但速度快于普通回溯算法。通过Java实现,算法使用栈存储操作步骤,并进行路径优化,避免在地图上转圈。文章提到,通过调整评价值函数可以改进算法效果,欢迎读者提供优化建议。
摘要由CSDN通过智能技术生成

    二维地图的寻路算法2。

    首先需要说明本算法得到的解不一定是最优解,但是比普通的回溯算法速度要快。

    代码如下:

  1. import java.util.Stack;
  2. /**
  3.  * 找到从地图上一个点到另一个点的路径
  4.  * 
  5.  * @author cuilichen
  6.  * 
  7.  */
  8. public class FindPath {
  9.     /**
  10.      * 用来存放操作步骤的栈
  11.      */
  12.     private Stack stack = new Stack();
  13.     /**
  14.      * 地图的宽度
  15.      */
  16.     private int wid = 8;
  17.     /**
  18.      * 找到从地图上一个点到另一个点的路径
  19.      * 
  20.      * @param map
  21.      * @param origin
  22.      * @param target
  23.      * @return
  24.      */
  25.     public String find(byte[] map, int origin, int target) {
  26.         if (origin == target) {
  27.             return "";
  28.         }
  29.         int[] step = new int[10];
  30.         step[1] = origin;
  31.         judge(map, step, target);
  32.         stack.push(step);// 根节点
  33.         if (!findPath(map, target)) { // 没有找到路径
  34.             return null;
  35.         }
  36.         optimize(stack);
  37.         StringBuffer sb = new StringBuffer();
  38.         for (int i = 1; i < stack.size(); i++) {
  39.             step = (int[]) stack.elementAt(i);
  40.             sb.append((char) step[0]);
  41.         }
  42.         return sb.toString();
  43.     }
  44.     /**
  45.      * 得到相邻4个点的评价值(距目标点的直线距离的平方),并按照从小到大的顺序排列。
  46.      * 
  47.      * @param map
  48.      * @param node
  49.      * @param target
  50.      */
  51.     private void judge(byte[] map, int[] node, int target) {
  52.         int origin 
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
你可以使用广度优先搜索(BFS)算法来解决二维数组的寻路问题。下面是一个简单的示例代码,用于找到从起点到终点的最短路径: ```python from collections import deque def bfs(matrix, start, end): # 获取二维数组的行数和列数 rows = len(matrix) cols = len(matrix[0]) # 定义四个方向的偏移量,上、下、左、右 directions = [(-1, 0), (1, 0), (0, -1), (0, 1)] # 使用队列来保存待访问的节点 queue = deque() queue.append(start) # 使用visited集合来记录已经访问过的节点 visited = set() visited.add(start) # 使用distances字典来记录每个节点到起点的距离 distances = {} distances[start] = 0 while queue: node = queue.popleft() if node == end: # 找到终点,返回最短路径长度 return distances[node] x, y = node for dx, dy in directions: new_x, new_y = x + dx, y + dy # 检查新的节点是否越界或已经访问过 if 0 <= new_x < rows and 0 <= new_y < cols and (new_x, new_y) not in visited and matrix[new_x][new_y] != 0: # 更新新节点的距离,并添加到队列和visited集合中 new_node = (new_x, new_y) queue.append(new_node) visited.add(new_node) distances[new_node] = distances[node] + 1 # 没有找到终点,返回-1表示无法到达 return -1 ``` 你可以根据实际情况调用这个函数,并传入相应的参数,例如起点坐标和终点坐标。注意,这个示例代码假设二维数组中的非零元素表示可以通过的路径,零表示障碍物。你可以根据实际需求进行修改。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值