wire routing 网格寻址

问题描述:找A----B的路径:

算法:

1. 搜索过程

* 先从位置a(3,2)开始, 把a可到达的相邻方格都表为1( 表示与a相距为1). 注意: 具体实现时, 将a位置置为2, 其它相邻方格为a位置的值+1

* 然后把标记为1的方格可到达的相邻方格都标记为2( 表示与a相距为2).

这里需要什么数据结构?
* 标记过程继续进行下去, 直至到达b或找不到可到达的相邻方格为止.

本例中, 当到达b时, b上的表记为9(实现时为9+2=11)

2. 构造a---?b的路径. 从b回溯到a .
这里需要什么数据结构?

* 从b出发, 并将b的位置保存在path中. 首先移动到比b的编号小1的相邻
位置上(5,6)

* 接着再从当前位置继续移动到比当前标号小1的相邻位置上.
* 重复这一过程, 直至到达a.

实现:

 1 bool FindPath(Position start, Position finish, int & PathLen, Position * & path) { if (( start.row = = finish.row) &&(start.col = = finish.col))
 2 { PathLen = 0; return true;} for ( int i = 0; i<= m+1; i++)
 3 { grid[0][i] = grid[m+1][i] = 1; grid[i][0] = grid[i][m+1] = 1;}
 4 Position offset[4];
 5 offset[0].row = 0; offset[0].col = 1;
 6 offset[1].row = 1; offset[1].col = 0;
 7 offset[2].row = 0; offset[2].col = -1;
 8 offset[3].row = -1; offset[3].col = 0;
 9 int NumOfNbrs = 4;
10 Position here, nbr;
11 here.row = start.row; here.col = start.col; grid[start.row][start.col] = 2;
12 ?2)Wire Routing
13 LinkedQueue<Position>Q; do{ //label neighbors of here
14 for ( int i = 0; i< NumOfNbrs; i++)
15 { nbr.row = here.row + offset[i].row;
16 nbr.col = here.col + offset[i].col; if (grid[nbr.row][nbr.col] = = 0)
17 { grid[nbr.row][nbr.col] = grid[here.row][here.col]+1;
18 if ((nbr.row = = finish.row) &&(nbr.col = = finish.col)) break; Q.Add(nbr);
19 }// end of if }// end of for
20 if (( nbr.row = = finish.row) && (nbr.col = = finish.col)) break; if (Q.IsEmpty()) return false;
21 Q.Delete(here);
22 } while(true);
23
24 PathLen = grid[finish.row][finish.col]-2; path = new Position [PathLen];
25 //trace backwards from finish
26 here = finish;
27 for ( int j = PathLen-1; j >= 0; j--) { path[j] = here;
28 for ( int i = 0; i < NumOfNbrs; i++)
29 { nbr.row = here.row + offset[i].row;
30 nbr.col = here.col + offset[i].col;
31 if ( grid[nbr.row][nbr.col] = = j+2) break; }
32 here = nbr; }
33 return true; }

并不是很理解,mark后在详细看看。

时间: 2024-10-27 07:41:27

wire routing 网格寻址的相关文章

LSI设计(4)FOCR快速最优通道布线

 [email protected]   [摘要]本文提出的快速最优通道布线算法FOCR(Fast Optimal Channel Router)是Kernighan-shweikert-Persky 最优通道布线算法[2]和wada的改进布线算法[4]的改进.这些算法的"最优性"意义完全相同,但新算法的执行速度统计地比上述二种法远远为快. 1.引 言  通道布线算法是大规模集成电路(LSI)和印刷电路板(PCB)布线设计中广泛应用的一类算法,其特点是采用并行布线方式,因而与串行布线的

laravel中的$request生成过程

laravel应用程序中index.php是所有请求的入口.当用户提交一个form或者访问一个网页时,首先由kernel捕捉到该session PHP运行环境下的用户数据, 生成一个request对象,该对象再传入routing系统寻址到对应的controller,最终由controller形成response返回给浏览器,完成整个网页请求的生命周期. $kernel->handle $request=Illuminate\Http\Request::capture->createFromBa

Routing Manager for WCF4 z

http://www.codeproject.com/Articles/77198/Routing-Manager-for-WCF Download source Contents Features Introduction Concept and Design Usage and Test Implementation Conclusion Features Manageable Routing Service Mapping physical to logical endpoints Man

Meandering Through the Maze of MFC Message and Command Routing

Meandering Through the Maze of MFC Message and Command Routing Paul DiLascia Paul DiLascia is a freelance software consultant specializing in developing C++ applications for Windows. He is the author of Windows++: Writing Reusable Code in C++ (Addiso

docker深入2-熟悉 ingress routing mesh 的工作方式

2017/9/22 1.目的 总所周知,service 通过 ingress load balancing 来发布服务,且 swarm 集群中所有 node 都参与到 ingress 路由网格(ingress routing mesh) 中,访问任意一个 node+PublishedPort 即可访问到服务. 其中负载均衡相关的原理是怎样的呢? 网络流量是怎样流动的呢? 让我们探索一下吧. 2.具体请参考博文,有空翻译一下. How Docker Swarm Container Networki

via/route blockage/size blockage/wire/pin guide/pin blockage/partition

1.via 中文名称互连线通孔.我们知道,芯片的连线有不同层的金属互连线相互连接.而Via的作用就是连接这些不同层的金属.如下图所示: 一个完整的通孔是由三层组成的,包括两个互连层和一个cut层,cut层可以理解为连接两层互连线的接口.比如V23,就代表着Metal 3与Metal 2之间的Via,中间是cut层,Metal 3是它的top metal, Metal 2是它的bottom metal.如下图所示: Via的种类也分好多种,按照功能划分,可以分成regular via(信号线通孔)

CSS3 网格布局(grid-layout)基础知识 - 网格模板属性(grid-template)使用说明

CSS3引入了新的网格布局(grid layout),以适应显示和设计技术的发展(尤其是移动设备优先的响应式设计). 主要目标是建立一个稳定可预料且语义正确的网页布局模式,用来替代过往表现不稳定且繁琐的table.flow以及JS脚本混合技术来实现的网页动态布局. 本文将简单而准确的介绍网格布局属性的基本概念和使用方法(摘自踏得网在线HTML5教程). 1. 概述 网格模板区域(grid-template-areas).网格模板行(grid-template-rows)和网格模板列(grid-t

开放寻址法

//开放寻址法 //散列函数包括线性探测.二次探测.双重探测 #include<iostream> using namespace std; //除法散列法 int h1(int k,int m) {         return k%m;  } //乘法散列法 int h2(int k,int m,float A) {         float fnum=(float)k;         float re=((fnum*A)-(int)(fnum*A))*m;         retur

深入理解Linux内核 - 第二章 内存寻址 01

1,三个地址 逻辑地址,机器语言指令中用来指定一个操作数或一条指令的地址. 线性地址:32位无符号整数,高达4GB.64位的cpu就是64位的线性地址 物理地址:内存芯片级内存单元寻址.老式x86由32位或36位无符号整数表示. 2,MMU内存控制单元 存在一个分段单元的硬件电路将一个逻辑地址转换为线性地址 存在一个分页单元的硬件电路将线性地址转换成一个物理地址. 问题: 1,为什么物理地址能够用36位的地址来表示? 2,为什么是逻辑地址转换成线性地址,再由线性地址转换为物理地址,这3个地址是什