问题描述:找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