2013-10-05 86 views
4

目前我建立在C小的基于网格的游戏++使用SDL。我制作了一个贴图类,它代表地图上的每个贴图。此瓦片类用于2维矢量,一维表示X轴,另一维表示Y轴。寻路的网格系统

我有一个算法问题,我甚至不知道从哪里开始的这一点,让我们说我有这个地图:

0 0 1 1 0 E 
0 0 0 1 0 1 
0 C 0 1 0 1 
0 1 0 1 0 1 
0 1 1 1 1 1 

C是我的性格,E是一个出口,和1一块地板砖。

我想找出最优化的方式,以找出是否有一个为到达出口处的字符的方式。我知道我可以使用一个函数来手动检查C周围的每个瓷砖,并且对于C周围的每个地砖,我再次检查周围的每个瓷砖,直到找到达到E的一致路径,但这看起来不是最佳的。

我能有一个线索或某种方向,其中以确定自己的方向?

+0

广度优先搜索和Dijkstra算法 – thefourtheye

+1

我认为,[A *](HTTP:// EN .wikipedia.org/wiki/A * _search_algorithm)是最好的算法(虽然不太容易编码)。 – memo1288

+0

对于那些你只想知道是否有退出的小型网格,我可能会使用BFS。 –

回答

5

有这么多的算法,它可以找到两个点之间的路径。有三种算法易于实现和理解。

  1. 深度优先搜索(DFS)
  2. 广度优先搜索(BFS)
  3. Dijkstra算法

深度优先搜索

这种算法,以当前节点,发现所有的邻居,把它们放在一个堆栈中,一个弹出并遍历到最后或找到路径。

广度优先搜索

这种算法,以当前的节点,发现所有的邻居,把它们放在一个队列,一个队列中取出一个穿越到年底或者找到的路径。

DFS和BFS之间的不同之处在于,DFS无法保证最佳的解决方案。考虑这种情况。

S 1 1 
1 1 1 
1 1 E 

假设S是(0,0),E是(2,2)。这个迷宫有许多最佳解决方案。因为DFS检查其邻居的路径直到结束,它可能需要S -> (1,0) -> (2,0) -> (2,1) -> (1,1) -> (1,2) -> E,它将返回6作为路径的成本。而BFS找到所有的邻居,邻居的邻居并继续。如果其中一个邻居是E,它将返回成本。这将被保证是最佳的。所以,BFS可能会这样。 S -> (1,0) -> (2,0) -> (2,1) -> E(它发现邻居的邻居,它不会走到每个邻居的尽头)。

Dijkstra算法

它类似于BFS,但它可以具有权重。在这个例子中,我们假定从一个节点移动到另一个节点的成本为1个单位。在Dijkstra算法中,它允许我们使用任何正整数作为成本,并且它对于每个链接都可能不同。

结论

如果你想要最佳的结果,去BFS或Dijkstra算法。对于你的情况,BFS应该工作。

0

让我们假设地面为:

     1 1 1 1 1 E 
         1 1 1 1 1 1 
         1 1 1 1 1 1 
         1 1 1 1 1 1 
         1 1 1 1 1 1 
         C 1 1 1 1 1 

但总是试图让程序知道形状的特性如广场上的各方平等所以这就是为什么一个完美的对角线方法是最短的,所以如果有墙壁ü可以让你的程序选择对角线的最近部分为

     1 1 1 1 1 E 
         1 1 1 1 0 1 
         1 1 1 0 1 1 
         1 1 0 1 1 1 
         1 0 1 1 1 1 
         C 1 1 1 1 1 

部分旁边C( 1),然后再对角继续将有所帮助。 为任何语法或拼写错误道歉。

1
#include<bits/stdc++.h> 
using namespace std; 

#define ROW 9 
#define COL 10 

// Creating a shortcut for int, int pair type 
typedef pair<int, int> Pair; 

// Creating a shortcut for pair<int, pair<int, int>> type 
typedef pair<double, pair<int, int> > pPair; 

// A structure to hold the neccesary parameters 
struct cell 
{ 
    // Row and Column index of its parent 
    // Note that 0 <= i <= ROW-1 & 0 <= j <= COL-1 
    int parent_i, parent_j; 
    // f = g + h 
    double f, g, h; 
}; 

// A Utility Function to check whether given cell (row, col) 
// is a valid cell or not. 
bool isValid(int row, int col) 
{ 
    // Returns true if row number and column number 
    // is in range 
    return (row >= 0) && (row < ROW) && 
      (col >= 0) && (col < COL); 
} 

// A Utility Function to check whether the given cell is 
// blocked or not 
bool isUnBlocked(int grid[][COL], int row, int col) 
{ 
    // Returns true if the cell is not blocked else false 
    if (grid[row][col] == 1) 
     return (true); 
    else 
     return (false); 
} 

// A Utility Function to check whether destination cell has 
// been reached or not 
bool isDestination(int row, int col, Pair dest) 
{ 
    if (row == dest.first && col == dest.second) 
     return (true); 
    else 
     return (false); 
} 

// A Utility Function to calculate the 'h' heuristics. 
double calculateHValue(int row, int col, Pair dest) 
{ 
    // Return using the distance formula 
    return ((double)sqrt ((row-dest.first)*(row-dest.first) 
          + (col-dest.second)*(col-dest.second))); 
} 

// A Utility Function to trace the path from the source 
// to destination 
void tracePath(cell cellDetails[][COL], Pair dest) 
{ 
    printf ("\nThe Path is "); 
    int row = dest.first; 
    int col = dest.second; 

    stack<Pair> Path; 

    while (!(cellDetails[row][col].parent_i == row 
      && cellDetails[row][col].parent_j == col)) 
    { 
     Path.push (make_pair (row, col)); 
     int temp_row = cellDetails[row][col].parent_i; 
     int temp_col = cellDetails[row][col].parent_j; 
     row = temp_row; 
     col = temp_col; 
    } 

    Path.push (make_pair (row, col)); 
    while (!Path.empty()) 
    { 
     pair<int,int> p = Path.top(); 
     Path.pop(); 
     printf("-> (%d,%d) ",p.first,p.second); 
    } 

    return; 
} 

// A Function to find the shortest path between 
// a given source cell to a destination cell according 
// to A* Search Algorithm 
void aStarSearch(int grid[][COL], Pair src, Pair dest) 
{ 
    // If the source is out of range 
    if (isValid (src.first, src.second) == false) 
    { 
     printf ("Source is invalid\n"); 
     return; 
    } 

    // If the destination is out of range 
    if (isValid (dest.first, dest.second) == false) 
    { 
     printf ("Destination is invalid\n"); 
     return; 
    } 

    // Either the source or the destination is blocked 
    if (isUnBlocked(grid, src.first, src.second) == false || 
      isUnBlocked(grid, dest.first, dest.second) == false) 
    { 
     printf ("Source or the destination is blocked\n"); 
     return; 
    } 

    // If the destination cell is the same as source cell 
    if (isDestination(src.first, src.second, dest) == true) 
    { 
     printf ("We are already at the destination\n"); 
     return; 
    } 

    // Create a closed list and initialise it to false which means 
    // that no cell has been included yet 
    // This closed list is implemented as a boolean 2D array 
    bool closedList[ROW][COL]; 
    memset(closedList, false, sizeof (closedList)); 

    // Declare a 2D array of structure to hold the details 
    //of that cell 
    cell cellDetails[ROW][COL]; 

    int i, j; 

    for (i=0; i<ROW; i++) 
    { 
     for (j=0; j<COL; j++) 
     { 
      cellDetails[i][j].f = FLT_MAX; 
      cellDetails[i][j].g = FLT_MAX; 
      cellDetails[i][j].h = FLT_MAX; 
      cellDetails[i][j].parent_i = -1; 
      cellDetails[i][j].parent_j = -1; 
     } 
    } 

    // Initialising the parameters of the starting node 
    i = src.first, j = src.second; 
    cellDetails[i][j].f = 0.0; 
    cellDetails[i][j].g = 0.0; 
    cellDetails[i][j].h = 0.0; 
    cellDetails[i][j].parent_i = i; 
    cellDetails[i][j].parent_j = j; 

    /* 
    Create an open list having information as- 
    <f, <i, j>> 
    where f = g + h, 
    and i, j are the row and column index of that cell 
    Note that 0 <= i <= ROW-1 & 0 <= j <= COL-1 
    This open list is implenented as a set of pair of pair.*/ 
    set<pPair> openList; 

    // Put the starting cell on the open list and set its 
    // 'f' as 0 
    openList.insert(make_pair (0.0, make_pair (i, j))); 

    // We set this boolean value as false as initially 
    // the destination is not reached. 
    bool foundDest = false; 

    while (!openList.empty()) 
    { 
     pPair p = *openList.begin(); 

     // Remove this vertex from the open list 
     openList.erase(openList.begin()); 

     // Add this vertex to the open list 
     i = p.second.first; 
     j = p.second.second; 
     closedList[i][j] = true; 

     /* 
     Generating all the 8 successor of this cell 

      N.W N N.E 
       \ | /
       \ |/
      W----Cell----E 
       /| \ 
      / | \ 
      S.W S S.E 

     Cell-->Popped Cell (i, j) 
     N --> North  (i-1, j) 
     S --> South  (i+1, j) 
     E --> East  (i, j+1) 
     W --> West   (i, j-1) 
     N.E--> North-East (i-1, j+1) 
     N.W--> North-West (i-1, j-1) 
     S.E--> South-East (i+1, j+1) 
     S.W--> South-West (i+1, j-1)*/ 

     // To store the 'g', 'h' and 'f' of the 8 successors 
     double gNew, hNew, fNew; 

     //----------- 1st Successor (North) ------------ 

     // Only process this cell if this is a valid one 
     if (isValid(i-1, j) == true) 
     { 
      // If the destination cell is the same as the 
      // current successor 
      if (isDestination(i-1, j, dest) == true) 
      { 
       // Set the Parent of the destination cell 
       cellDetails[i-1][j].parent_i = i; 
       cellDetails[i-1][j].parent_j = j; 
       printf ("The destination cell is found\n"); 
       tracePath (cellDetails, dest); 
       foundDest = true; 
       return; 
      } 
      // If the successor is already on the closed 
      // list or if it is blocked, then ignore it. 
      // Else do the following 
      else if (closedList[i-1][j] == false && 
        isUnBlocked(grid, i-1, j) == true) 
      { 
       gNew = cellDetails[i][j].g + 1.0; 
       hNew = calculateHValue (i-1, j, dest); 
       fNew = gNew + hNew; 

       // If it isn’t on the open list, add it to 
       // the open list. Make the current square 
       // the parent of this square. Record the 
       // f, g, and h costs of the square cell 
       //    OR 
       // If it is on the open list already, check 
       // to see if this path to that square is better, 
       // using 'f' cost as the measure. 
       if (cellDetails[i-1][j].f == FLT_MAX || 
         cellDetails[i-1][j].f > fNew) 
       { 
        openList.insert(make_pair(fNew, 
               make_pair(i-1, j))); 

        // Update the details of this cell 
        cellDetails[i-1][j].f = fNew; 
        cellDetails[i-1][j].g = gNew; 
        cellDetails[i-1][j].h = hNew; 
        cellDetails[i-1][j].parent_i = i; 
        cellDetails[i-1][j].parent_j = j; 
       } 
      } 
     } 

     //----------- 2nd Successor (South) ------------ 

     // Only process this cell if this is a valid one 
     if (isValid(i+1, j) == true) 
     { 
      // If the destination cell is the same as the 
      // current successor 
      if (isDestination(i+1, j, dest) == true) 
      { 
       // Set the Parent of the destination cell 
       cellDetails[i+1][j].parent_i = i; 
       cellDetails[i+1][j].parent_j = j; 
       printf("The destination cell is found\n"); 
       tracePath(cellDetails, dest); 
       foundDest = true; 
       return; 
      } 
      // If the successor is already on the closed 
      // list or if it is blocked, then ignore it. 
      // Else do the following 
      else if (closedList[i+1][j] == false && 
        isUnBlocked(grid, i+1, j) == true) 
      { 
       gNew = cellDetails[i][j].g + 1.0; 
       hNew = calculateHValue(i+1, j, dest); 
       fNew = gNew + hNew; 

       // If it isn’t on the open list, add it to 
       // the open list. Make the current square 
       // the parent of this square. Record the 
       // f, g, and h costs of the square cell 
       //    OR 
       // If it is on the open list already, check 
       // to see if this path to that square is better, 
       // using 'f' cost as the measure. 
       if (cellDetails[i+1][j].f == FLT_MAX || 
         cellDetails[i+1][j].f > fNew) 
       { 
        openList.insert(make_pair (fNew, make_pair (i+1, j))); 
        // Update the details of this cell 
        cellDetails[i+1][j].f = fNew; 
        cellDetails[i+1][j].g = gNew; 
        cellDetails[i+1][j].h = hNew; 
        cellDetails[i+1][j].parent_i = i; 
        cellDetails[i+1][j].parent_j = j; 
       } 
      } 
     } 

     //----------- 3rd Successor (East) ------------ 

     // Only process this cell if this is a valid one 
     if (isValid (i, j+1) == true) 
     { 
      // If the destination cell is the same as the 
      // current successor 
      if (isDestination(i, j+1, dest) == true) 
      { 
       // Set the Parent of the destination cell 
       cellDetails[i][j+1].parent_i = i; 
       cellDetails[i][j+1].parent_j = j; 
       printf("The destination cell is found\n"); 
       tracePath(cellDetails, dest); 
       foundDest = true; 
       return; 
      } 

      // If the successor is already on the closed 
      // list or if it is blocked, then ignore it. 
      // Else do the following 
      else if (closedList[i][j+1] == false && 
        isUnBlocked (grid, i, j+1) == true) 
      { 
       gNew = cellDetails[i][j].g + 1.0; 
       hNew = calculateHValue (i, j+1, dest); 
       fNew = gNew + hNew; 

       // If it isn’t on the open list, add it to 
       // the open list. Make the current square 
       // the parent of this square. Record the 
       // f, g, and h costs of the square cell 
       //    OR 
       // If it is on the open list already, check 
       // to see if this path to that square is better, 
       // using 'f' cost as the measure. 
       if (cellDetails[i][j+1].f == FLT_MAX || 
         cellDetails[i][j+1].f > fNew) 
       { 
        openList.insert(make_pair(fNew, 
             make_pair (i, j+1))); 

        // Update the details of this cell 
        cellDetails[i][j+1].f = fNew; 
        cellDetails[i][j+1].g = gNew; 
        cellDetails[i][j+1].h = hNew; 
        cellDetails[i][j+1].parent_i = i; 
        cellDetails[i][j+1].parent_j = j; 
       } 
      } 
     } 

     //----------- 4th Successor (West) ------------ 

     // Only process this cell if this is a valid one 
     if (isValid(i, j-1) == true) 
     { 
      // If the destination cell is the same as the 
      // current successor 
      if (isDestination(i, j-1, dest) == true) 
      { 
       // Set the Parent of the destination cell 
       cellDetails[i][j-1].parent_i = i; 
       cellDetails[i][j-1].parent_j = j; 
       printf("The destination cell is found\n"); 
       tracePath(cellDetails, dest); 
       foundDest = true; 
       return; 
      } 

      // If the successor is already on the closed 
      // list or if it is blocked, then ignore it. 
      // Else do the following 
      else if (closedList[i][j-1] == false && 
        isUnBlocked(grid, i, j-1) == true) 
      { 
       gNew = cellDetails[i][j].g + 1.0; 
       hNew = calculateHValue(i, j-1, dest); 
       fNew = gNew + hNew; 

       // If it isn’t on the open list, add it to 
       // the open list. Make the current square 
       // the parent of this square. Record the 
       // f, g, and h costs of the square cell 
       //    OR 
       // If it is on the open list already, check 
       // to see if this path to that square is better, 
       // using 'f' cost as the measure. 
       if (cellDetails[i][j-1].f == FLT_MAX || 
         cellDetails[i][j-1].f > fNew) 
       { 
        openList.insert(make_pair (fNew, 
              make_pair (i, j-1))); 

        // Update the details of this cell 
        cellDetails[i][j-1].f = fNew; 
        cellDetails[i][j-1].g = gNew; 
        cellDetails[i][j-1].h = hNew; 
        cellDetails[i][j-1].parent_i = i; 
        cellDetails[i][j-1].parent_j = j; 
       } 
      } 
     } 

     //----------- 5th Successor (North-East) ------------ 

     // Only process this cell if this is a valid one 
     if (isValid(i-1, j+1) == true) 
     { 
      // If the destination cell is the same as the 
      // current successor 
      if (isDestination(i-1, j+1, dest) == true) 
      { 
       // Set the Parent of the destination cell 
       cellDetails[i-1][j+1].parent_i = i; 
       cellDetails[i-1][j+1].parent_j = j; 
       printf ("The destination cell is found\n"); 
       tracePath (cellDetails, dest); 
       foundDest = true; 
       return; 
      } 

      // If the successor is already on the closed 
      // list or if it is blocked, then ignore it. 
      // Else do the following 
      else if (closedList[i-1][j+1] == false && 
        isUnBlocked(grid, i-1, j+1) == true) 
      { 
       gNew = cellDetails[i][j].g + 1.414; 
       hNew = calculateHValue(i-1, j+1, dest); 
       fNew = gNew + hNew; 

       // If it isn’t on the open list, add it to 
       // the open list. Make the current square 
       // the parent of this square. Record the 
       // f, g, and h costs of the square cell 
       //    OR 
       // If it is on the open list already, check 
       // to see if this path to that square is better, 
       // using 'f' cost as the measure. 
       if (cellDetails[i-1][j+1].f == FLT_MAX || 
         cellDetails[i-1][j+1].f > fNew) 
       { 
        openList.insert(make_pair (fNew, 
            make_pair(i-1, j+1))); 

        // Update the details of this cell 
        cellDetails[i-1][j+1].f = fNew; 
        cellDetails[i-1][j+1].g = gNew; 
        cellDetails[i-1][j+1].h = hNew; 
        cellDetails[i-1][j+1].parent_i = i; 
        cellDetails[i-1][j+1].parent_j = j; 
       } 
      } 
     } 

     //----------- 6th Successor (North-West) ------------ 

     // Only process this cell if this is a valid one 
     if (isValid (i-1, j-1) == true) 
     { 
      // If the destination cell is the same as the 
      // current successor 
      if (isDestination (i-1, j-1, dest) == true) 
      { 
       // Set the Parent of the destination cell 
       cellDetails[i-1][j-1].parent_i = i; 
       cellDetails[i-1][j-1].parent_j = j; 
       printf ("The destination cell is found\n"); 
       tracePath (cellDetails, dest); 
       foundDest = true; 
       return; 
      } 

      // If the successor is already on the closed 
      // list or if it is blocked, then ignore it. 
      // Else do the following 
      else if (closedList[i-1][j-1] == false && 
        isUnBlocked(grid, i-1, j-1) == true) 
      { 
       gNew = cellDetails[i][j].g + 1.414; 
       hNew = calculateHValue(i-1, j-1, dest); 
       fNew = gNew + hNew; 

       // If it isn’t on the open list, add it to 
       // the open list. Make the current square 
       // the parent of this square. Record the 
       // f, g, and h costs of the square cell 
       //    OR 
       // If it is on the open list already, check 
       // to see if this path to that square is better, 
       // using 'f' cost as the measure. 
       if (cellDetails[i-1][j-1].f == FLT_MAX || 
         cellDetails[i-1][j-1].f > fNew) 
       { 
        openList.insert(make_pair (fNew, make_pair (i-1, j-1))); 
        // Update the details of this cell 
        cellDetails[i-1][j-1].f = fNew; 
        cellDetails[i-1][j-1].g = gNew; 
        cellDetails[i-1][j-1].h = hNew; 
        cellDetails[i-1][j-1].parent_i = i; 
        cellDetails[i-1][j-1].parent_j = j; 
       } 
      } 
     } 

     //----------- 7th Successor (South-East) ------------ 

     // Only process this cell if this is a valid one 
     if (isValid(i+1, j+1) == true) 
     { 
      // If the destination cell is the same as the 
      // current successor 
      if (isDestination(i+1, j+1, dest) == true) 
      { 
       // Set the Parent of the destination cell 
       cellDetails[i+1][j+1].parent_i = i; 
       cellDetails[i+1][j+1].parent_j = j; 
       printf ("The destination cell is found\n"); 
       tracePath (cellDetails, dest); 
       foundDest = true; 
       return; 
      } 

      // If the successor is already on the closed 
      // list or if it is blocked, then ignore it. 
      // Else do the following 
      else if (closedList[i+1][j+1] == false && 
        isUnBlocked(grid, i+1, j+1) == true) 
      { 
       gNew = cellDetails[i][j].g + 1.414; 
       hNew = calculateHValue(i+1, j+1, dest); 
       fNew = gNew + hNew; 

       // If it isn’t on the open list, add it to 
       // the open list. Make the current square 
       // the parent of this square. Record the 
       // f, g, and h costs of the square cell 
       //    OR 
       // If it is on the open list already, check 
       // to see if this path to that square is better, 
       // using 'f' cost as the measure. 
       if (cellDetails[i+1][j+1].f == FLT_MAX || 
         cellDetails[i+1][j+1].f > fNew) 
       { 
        openList.insert(make_pair(fNew, 
             make_pair (i+1, j+1))); 

        // Update the details of this cell 
        cellDetails[i+1][j+1].f = fNew; 
        cellDetails[i+1][j+1].g = gNew; 
        cellDetails[i+1][j+1].h = hNew; 
        cellDetails[i+1][j+1].parent_i = i; 
        cellDetails[i+1][j+1].parent_j = j; 
       } 
      } 
     } 

     //----------- 8th Successor (South-West) ------------ 

     // Only process this cell if this is a valid one 
     if (isValid (i+1, j-1) == true) 
     { 
      // If the destination cell is the same as the 
      // current successor 
      if (isDestination(i+1, j-1, dest) == true) 
      { 
       // Set the Parent of the destination cell 
       cellDetails[i+1][j-1].parent_i = i; 
       cellDetails[i+1][j-1].parent_j = j; 
       printf("The destination cell is found\n"); 
       tracePath(cellDetails, dest); 
       foundDest = true; 
       return; 
      } 

      // If the successor is already on the closed 
      // list or if it is blocked, then ignore it. 
      // Else do the following 
      else if (closedList[i+1][j-1] == false && 
        isUnBlocked(grid, i+1, j-1) == true) 
      { 
       gNew = cellDetails[i][j].g + 1.414; 
       hNew = calculateHValue(i+1, j-1, dest); 
       fNew = gNew + hNew; 

       // If it isn’t on the open list, add it to 
       // the open list. Make the current square 
       // the parent of this square. Record the 
       // f, g, and h costs of the square cell 
       //    OR 
       // If it is on the open list already, check 
       // to see if this path to that square is better, 
       // using 'f' cost as the measure. 
       if (cellDetails[i+1][j-1].f == FLT_MAX || 
         cellDetails[i+1][j-1].f > fNew) 
       { 
        openList.insert(make_pair(fNew, 
             make_pair(i+1, j-1))); 

        // Update the details of this cell 
        cellDetails[i+1][j-1].f = fNew; 
        cellDetails[i+1][j-1].g = gNew; 
        cellDetails[i+1][j-1].h = hNew; 
        cellDetails[i+1][j-1].parent_i = i; 
        cellDetails[i+1][j-1].parent_j = j; 
       } 
      } 
     } 
    } 

    // When the destination cell is not found and the open 
    // list is empty, then we conclude that we failed to 
    // reach the destiantion cell. This may happen when the 
    // there is no way to destination cell (due to blockages) 
    if (foundDest == false) 
     printf("Failed to find the Destination Cell\n"); 

    return; 
} 


// Driver program to test above function 
int main() 
{ 
    /* Description of the Grid- 
    1--> The cell is not blocked 
    0--> The cell is blocked */ 
    int grid[ROW][COL] = 
    { 
     { 1, 0, 1, 1, 1, 1, 0, 1, 1, 1 }, 
     { 1, 1, 1, 0, 1, 1, 1, 0, 1, 1 }, 
     { 1, 1, 1, 0, 1, 1, 0, 1, 0, 1 }, 
     { 0, 0, 1, 0, 1, 0, 0, 0, 0, 1 }, 
     { 1, 1, 1, 0, 1, 1, 1, 0, 1, 0 }, 
     { 1, 0, 1, 1, 1, 1, 0, 1, 0, 0 }, 
     { 1, 0, 0, 0, 0, 1, 0, 0, 0, 1 }, 
     { 1, 0, 1, 1, 1, 1, 0, 1, 1, 1 }, 
     { 1, 1, 1, 0, 0, 0, 1, 0, 0, 1 } 
    }; 

    // Source is the left-most bottom-most corner 
    Pair src = make_pair(8, 0); 

    // Destination is the left-most top-most corner 
    Pair dest = make_pair(0, 0); 

    aStarSearch(grid, src, dest); 

    return(0); 
} 

你可以尝试为9行取得A *算法中 和10周的cols 更新按照您的要求