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;
122)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后在详细看看。

 

 

 

 

 

 
posted @ 2016-05-22 15:29  bounce  阅读(353)  评论(0编辑  收藏  举报