问题定义:
将布线区域划分成一格n*m的网格,网格内用-1来标识障碍点,求网格内一点到另一点之间的最短路径。
思想:
1、标记距离:
先用BFS的方法将网格做个标记,在经过每个的点的位置上记录一下该点到初始点start之间的距离,一直到终点end
2、回走记录路径:
从终点往回走,每次只走到比当前位置与开始点start距离小1的位置,边走边记录路径。

开始时地图:(-1表示障碍不能走,0表示能走)

  -1  -1  -1  -1  -1  -1  -1  -1  -1-1   0   0  -1   0   0   0   0  -1-1   0   0  -1  -1   0   0   0  -1-1   0   0   0   0  -1   0   0  -1-1   0   0   0  -1  -1   0   0  -1-1  -1   0   0   0  -1   0   0  -1-1  -1  -1  -1   0   0   0   0  -1-1  -1  -1  -1   0   0   0   0  -1-1  -1  -1  -1  -1  -1  -1  -1  -1

代码

#include<iostream>
#include <iomanip>
#include<queue>
using namespace std;const int M = 9;
const int MAXLEN = 30;class Point
{public:int x;  int y;
};int dx[4] = {0,1,0,-1};   //x、y方向上的增量   上右下左
int dy[4] = {-1,0,1,0};void findPath(int G[][M],Point start,Point finish,int& pathLen,Point* path)
{//寻找从start到finish的最短路径path及其长度pathLen。if(start.x == finish.x && start.y == finish.y)     //两点重合 {pathLen = 0;return ; } Point cur,next;G[start.x][start.y] = 1;    //封锁开始点 queue<int> qx,qy;    //坐标队列 qx.push(start.x);    qy.push(start.y);  //开始点进入队列 while(!qx.empty()){cur.x = qx.front(); qx.pop();      // cur为当前位置 cur.y = qy.front(); qy.pop();for(int i = 0;i < 4; i++){next.x = cur.x + dx[i];  next.y = cur.y + dy[i];   // next为下一位置 if(!G[next.x][next.y])               //该位置未被标记 {G[next.x][next.y] = G[cur.x][cur.y] + 1; if(next.x == finish.x && next.y == finish.y)    //已到达出口  {break;}   qx.push(next.x);qy.push(next.y); } }if(next.x == finish.x && next.y == finish.y) break;   //已到达出口 } //构造路径 pathLen = G[finish.x][finish.y];cur = finish;for(int i = pathLen-1; i >= 0; i--){path[i] = cur;      //记录当前位置for(int j = 0; j < 4; j++)          //寻找前一位置 {next.x = cur.x + dx[j];         next.y = cur.y + dy[j];if(G[next.x][next.y] > -1 && G[next.x][next.y] < G[cur.x][cur.y]) {break;} }cur = next;  //移动到当前位置 }
} int main()
{int G[M][M];          //网格地图 Point start,finish;   // 开始点 int pathLen=0;          //最短路径 for(int i = 0; i < M; i++)  //初始化网外围墙为 -1 {G[0][i] = G[M-1][i] = G[i][0] = G[i][M-1] = -1; }for(int i = 1; i < M-1; i++)    //初始化网格内区域为0 {for(int j = 1; j < M-1; j++)G[i][j] = 0; }G[5][1] = -1; G[6][1] = -1; G[6][2] = -1; G[6][3] = -1; G[7][1] = -1;G[7][2] = -1; G[7][3] = -1; G[1][3] = -1; G[2][3] = -1; G[2][4] = -1;G[3][5] = -1; G[4][4] = -1; G[4][5] = -1; G[5][5] = -1;     // 内部设墙for(int i = 0; i < M; i++){for(int j = 0; j < M; j++){cout<<setw(4)<<G[i][j]; }cout<<endl;} start.x = 3; start.y = 2; finish.x = 4; finish.y = 6;Point *path = new Point[M*M]; findPath(G,start,finish,pathLen,path);for(int i = 0; i < M; i++){for(int j = 0; j < M; j++){cout<<setw(4)<<G[i][j]; }cout<<endl;}for(int i = 0; i < pathLen; i++){cout<<"("<< path[i].x <<","<<path[i].y<<")"<<endl;} for(int i = 0; i < M; i++){for(int j = 0; j < M; j++){cout<<setw(4)<<G[i][j]; }cout<<endl;}return 0;
}

输出:

寻找电路布线最短路径算法BFS相关推荐

  1. 数据结构(六):图的概念、存储方式、基本操作、最小生成树、最短路径、有向无环图、关键路径 | Prim、Kruskal算法 | BFS、Dijkstra、Floyd算法 | 拓扑排序 | 求关键路径

    文章目录 第六章 图 一.图 (一)图的定义 (二)图逻辑结构的应用 (三)无向图.有向图 (四)简单图.多重图 (五)顶点的度.入度.出度 (六)顶点-顶点的关系描述 (七)连通图.强连通图 (八) ...

  2. 图的应用—求解最短路径(BFS、Dijkstra和Floyd算法)

    BFS算法虽然可以求解最短路径问题,但是需要注意的是该算法只能求解非带权图的单源最短路径问题,或者说带权值相同且为1的图单源最短路径问题. 1.图的邻接矩阵存储结构定义 #define MaxVerN ...

  3. python最短路径例子_Python实现的多叉树寻找最短路径算法示例

    本文实例讲述了Python实现的多叉树寻找最短路径算法.分享给大家供大家参考,具体如下: 多叉树的最短路径: 思想: 传入start 和 end 两个 目标值 1 找到从根节点到目标节点的路径 2 从 ...

  4. 深度搜索 java_java实现的深度搜索与广度搜索算法BFS,DFS以及几种最短路径算法...

    java实现的深度搜索与广度搜索算法BFS,DFS以及几种最短路径算法 public class City { String name; int id; static int idCounter = ...

  5. 迷宫问题寻找最短路径(BFS)

    目录导航 问题描述 BFS原理(BFS:广度优先搜索) Java实现 C++实现 问题描述 如下图,找到从(1,1)到(6,5)的最短路径. BFS原理(BFS:广度优先搜索) 故事设定:走格子策略为 ...

  6. (最短路径算法整理)dijkstra、floyd、bellman-ford、spfa算法

    一.floyd 1.介绍 floyd算法只有五行代码,代码简单,三个for循环就可以解决问题,所以它的时间复杂度为O(n^3),可以求多源最短路问题. 2.思想: Floyd算法的基本思想如下:从任意 ...

  7. 沃舍尔算法_[数据结构拾遗]图的最短路径算法

    前言 本专题旨在快速了解常见的数据结构和算法. 在需要使用到相应算法时,能够帮助你回忆出常用的实现方案并且知晓其优缺点和适用环境.并不涉及十分具体的实现细节描述. 图的最短路径算法 最短路径问题是图论 ...

  8. 图论3之图的最短路径算法

    上一篇我们讨论了图的遍历,实际问题中图的深度遍历是我们更常用的,除了图的遍历,我们一般遇到的问题更多是关于图的路径的问题.本篇将介绍图的四种常用遍历算法 一.深度或广度优先搜索算法(解决单源最短路径) ...

  9. 图论:图的四种最短路径算法

    目录: 1.DFS(单源最短路径算法) 例题1: DFS题目分析: 代码DFS: 2.Floyed(时间复杂度On^3) 1.应用场景: 2.解析算法: 核心代码1: 我的笔记 核心代码2: Floy ...

最新文章

  1. mSystems: 中科院动物所王德华组揭示低温下野生动物肠道菌群提高存活率的机制...
  2. 我的博客即将同步至腾讯云+社区
  3. GXU - 7D - 区间求和 - 前缀和
  4. cesium添加填充_Cesium中级教程1 - 空间数据可视化(一)
  5. 数据结构与算法简单总结()
  6. 五子棋 鼠标 C语言,c语言写的鼠标操作的五子棋游戏,欢迎观赏!
  7. 第三个Sprint冲刺第十天
  8. delphi xe android 黑屏,Delphi XE之路(3)解决启动时短暂的黑屏
  9. 电力电子仿真软件Plecs数据类型
  10. STM32+ESP8266实现远程控制LED
  11. OAuth2:资源服务器
  12. IDEA 运行 Tomcat 中文乱码的问题
  13. 手机会员积分 html,会员积分系统主要有什么作用和功能?
  14. php学习笔记——PHP 概述
  15. 恶心的八皇后全解python版
  16. WSTMart 国内开源商城系统佼佼者
  17. java操纵excel文件2
  18. 超简单的vue3.0,必看文档
  19. 2021年中国夜间经济行业发展规模及发展趋势分析[图]
  20. Linux/Unix关机、重启(shutdown\reboot\halt\init)等命令

热门文章

  1. python自学教程-Python学习教程(一)自学资源分享
  2. python爬虫菜鸟教程-Python 应该怎么学?
  3. python是什么 自学-自学python需要什么基础,要掌握哪些知识?
  4. python和c++哪个好-Scratch和Python与C++选哪个合适
  5. python读取指定路径txt文件-python读取txt文件并取其某一列数据的示例
  6. 【重磅】亚马逊向第三方开放Echo音箱语音识别技术(附AmazonEcho Dot拆解)
  7. 在vue中使用MD5加密
  8. php接口返回一个数组怎末写_PHP写api接口怎么写啊,有什么具体的例子吗?
  9. 西安工程大学计算机是几本专业,西安工程大学专业介绍
  10. app闪退后重启_安卓APP崩溃(crash)后重新启动,捕获全局异常重启APP