【问题标题】:Breadth first search is not returning the shortest path广度优先搜索不返回最短路径
【发布时间】:2015-01-04 17:40:28
【问题描述】:

我正在尝试使用 Java 的广度优先搜索算法。考虑到 10x10 网格,我试图找到最后一个单元格 9x9 (网格从 0,0 开始)。当它到达 9x9 时,它已经遍历了网格中的所有单元格。我听说 BFS 会给我最短路径。但实际上它给了我最长的路径。

  1. 能否告诉我这是否是预期的行为?
  2. 如果这是 BFS 的工作方式,那么获得到 9x9 单元的最短路径的最佳方法是什么?

请指教。

编辑——我已经使用了这个逻辑并完成了我的游戏。如需参考请查看https://play.google.com/store/apps/details?id=com.game.puzzle.game.ballmania.android

代码

package com.example.game.bfs.alogrithm;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

public class BFS {

static class Cell {
    private int x;
    private int y;
    private String value;
    private boolean visitStatus;

    public Cell(int x, int y, String value,boolean visitStatus) {
        this.x = x;
        this.y = y;
        this.value = value; 
        this.visitStatus=visitStatus;
    }
}

private Cell[][] board;

private List<Cell> visited = new ArrayList<Cell>();

private boolean testDone;

public void setBoard(Cell[][] board) {
    this.board = board;
} 

public Cell getAdjacentUnvisitedCell(Cell cell)
{  
   int moves[][] = { { -1, 0 }, { 0, -1 }, { 1, 0 }, { 0, 1 } };
   for (int n = 0; n < 4 /* moves.length */; ++n) {
       int ti = cell.x + moves[n][0];
       int tj = cell.y + moves[n][1];
      // System.out.println("ti,tj" + ti +"," + tj );  

       if (ti >= 0 && ti < board.length && tj >= 0 && tj < board[0].length) { 

          // System.out.println("getAdjacentUnvisitedCell : " + "[" + board[ti][tj].x + "," + board[ti][tj].y + "]" ); 
          // System.out.println("getAdjacentUnvisitedCell : board[ti][tj].visitStatus " + board[ti][tj].visitStatus ); 

           if(!board[ti][tj].visitStatus) {  
              return board[ti][tj];
           }
       }
   }  
   return null;  
} 

public void BFSearch(Cell start, Cell end) {  
   // BFS uses Queue data structure 
   Queue<Cell> q = new LinkedList<Cell>(); 
   q.add(start);
   visited.add(start);
   board[start.x][start.y].visitStatus = true;

   //printNode(start);

   while( !q.isEmpty() )
   { 
      Cell c; 
      c = q.peek(); 
      Cell unVisitedadjCell = getAdjacentUnvisitedCell(c); 

      if(!testDone){
          testDone=true;  
      } 

      if ( unVisitedadjCell != null )
      {  visited.add(unVisitedadjCell); 
         board[unVisitedadjCell.x][unVisitedadjCell.y].visitStatus = true;

         printNode(unVisitedadjCell,c); 
         q.add(unVisitedadjCell);
      }
      else
      {
         q.remove();
      }
   }

   visited.clear();     //Clear visited property of nodes
}


private void printNode(Cell c,Cell node) {
    System.out.println("For Node " + node.x +"," + node.y + ",   " + "Just Visited : " + "[" + c.x + "," + c.y + "]" );  
} 

public static void main(String[] args) {
    Cell[][] cells = new Cell[10][10];
    for (int i = 0; i < 10; i++) {
        for (int j = 0; j < 10; j++) {
            cells[i][j] = new Cell(i, j, "defaultvalue",false);
        }
    } 

    BFS board = new BFS();
    board.setBoard(cells);

    board.BFSearch(cells[0][0], cells[1][4]);
}


}

}

日志:

For Node 0,0,   Just Visited : [1,0]
For Node 0,0,   Just Visited : [0,1]
For Node 1,0,   Just Visited : [2,0]
For Node 1,0,   Just Visited : [1,1]
For Node 0,1,   Just Visited : [0,2]
For Node 2,0,   Just Visited : [3,0]
For Node 2,0,   Just Visited : [2,1]
For Node 1,1,   Just Visited : [1,2]
For Node 0,2,   Just Visited : [0,3]
For Node 3,0,   Just Visited : [4,0]
For Node 3,0,   Just Visited : [3,1]
For Node 2,1,   Just Visited : [2,2]
For Node 1,2,   Just Visited : [1,3]
For Node 0,3,   Just Visited : [0,4]
For Node 4,0,   Just Visited : [5,0]
For Node 4,0,   Just Visited : [4,1]
For Node 3,1,   Just Visited : [3,2]
For Node 2,2,   Just Visited : [2,3]
For Node 1,3,   Just Visited : [1,4]
For Node 0,4,   Just Visited : [0,5]
For Node 5,0,   Just Visited : [6,0]
For Node 5,0,   Just Visited : [5,1]
For Node 4,1,   Just Visited : [4,2]
For Node 3,2,   Just Visited : [3,3]
For Node 2,3,   Just Visited : [2,4]
For Node 1,4,   Just Visited : [1,5]
For Node 0,5,   Just Visited : [0,6]
For Node 6,0,   Just Visited : [7,0]
For Node 6,0,   Just Visited : [6,1]
For Node 5,1,   Just Visited : [5,2]
For Node 4,2,   Just Visited : [4,3]
For Node 3,3,   Just Visited : [3,4]
For Node 2,4,   Just Visited : [2,5]
For Node 1,5,   Just Visited : [1,6]
For Node 0,6,   Just Visited : [0,7]
For Node 7,0,   Just Visited : [8,0]
For Node 7,0,   Just Visited : [7,1]
For Node 6,1,   Just Visited : [6,2]
For Node 5,2,   Just Visited : [5,3]
For Node 4,3,   Just Visited : [4,4]
For Node 3,4,   Just Visited : [3,5]
For Node 2,5,   Just Visited : [2,6]
For Node 1,6,   Just Visited : [1,7]
For Node 0,7,   Just Visited : [0,8]
For Node 8,0,   Just Visited : [9,0]
For Node 8,0,   Just Visited : [8,1]
For Node 7,1,   Just Visited : [7,2]
For Node 6,2,   Just Visited : [6,3]
For Node 5,3,   Just Visited : [5,4]
For Node 4,4,   Just Visited : [4,5]
For Node 3,5,   Just Visited : [3,6]
For Node 2,6,   Just Visited : [2,7]
For Node 1,7,   Just Visited : [1,8]
For Node 0,8,   Just Visited : [0,9]
For Node 9,0,   Just Visited : [9,1]
For Node 8,1,   Just Visited : [8,2]
For Node 7,2,   Just Visited : [7,3]
For Node 6,3,   Just Visited : [6,4]
For Node 5,4,   Just Visited : [5,5]
For Node 4,5,   Just Visited : [4,6]
For Node 3,6,   Just Visited : [3,7]
For Node 2,7,   Just Visited : [2,8]
For Node 1,8,   Just Visited : [1,9]
For Node 9,1,   Just Visited : [9,2]
For Node 8,2,   Just Visited : [8,3]
For Node 7,3,   Just Visited : [7,4]
For Node 6,4,   Just Visited : [6,5]
For Node 5,5,   Just Visited : [5,6]
For Node 4,6,   Just Visited : [4,7]
For Node 3,7,   Just Visited : [3,8]
For Node 2,8,   Just Visited : [2,9]
For Node 9,2,   Just Visited : [9,3]
For Node 8,3,   Just Visited : [8,4]
For Node 7,4,   Just Visited : [7,5]
For Node 6,5,   Just Visited : [6,6]
For Node 5,6,   Just Visited : [5,7]
For Node 4,7,   Just Visited : [4,8]
For Node 3,8,   Just Visited : [3,9]
For Node 9,3,   Just Visited : [9,4]
For Node 8,4,   Just Visited : [8,5]
For Node 7,5,   Just Visited : [7,6]
For Node 6,6,   Just Visited : [6,7]
For Node 5,7,   Just Visited : [5,8]
For Node 4,8,   Just Visited : [4,9]
For Node 9,4,   Just Visited : [9,5]
For Node 8,5,   Just Visited : [8,6]
For Node 7,6,   Just Visited : [7,7]
For Node 6,7,   Just Visited : [6,8]
For Node 5,8,   Just Visited : [5,9]
For Node 9,5,   Just Visited : [9,6]
For Node 8,6,   Just Visited : [8,7]
For Node 7,7,   Just Visited : [7,8]
For Node 6,8,   Just Visited : [6,9]
For Node 9,6,   Just Visited : [9,7]
For Node 8,7,   Just Visited : [8,8]
For Node 7,8,   Just Visited : [7,9]
For Node 9,7,   Just Visited : [9,8]
For Node 8,8,   Just Visited : [8,9]
For Node 9,8,   Just Visited : [9,9]

访问单元格的模式。

【问题讨论】:

  • 哦,但它为您提供了最短路径。跟踪每个“trail”中访问过的cell,最先到达目标cell的“trail”最短。如果你想用它来寻路,我建议你试试 A-star 算法,其中广度优先是最坏的情况。
  • BFS 本身就是一种遍历图的方式。它可以通过附加逻辑的实现找到最短路径,并且仅适用于具有相同权重或无权重的边。更多详情this question

标签: java depth-first-search a-star breadth-first-search


【解决方案1】:

追溯日志,从结尾到开头。你会看到它实际上已经找到了最短的路径——沿着网格的边缘。不幸的是,在网格中,如果您不允许通过对角线(在这种情况下,BFS 会超出窗口,因为对角线应该具有不同的权重),所有只有“向右”和“向下”操作的路径都是最短的。

您可以通过简单的逻辑看到它 - 要从 0 到 9,您必须进行 9 步。你有2个坐标,你从(0, 0)(9, 9),只能通过1合1操作改变一个坐标,所以最短路径有9+9=18步骤。回溯一下,这条路径有 18 步。类似地,any 路径从头到尾只有操作 to the rightdown 将有 18 个步骤,因此任何这样的路径都是最短的。决定路径本身的只是将相邻坐标放入队列的顺序。尝试按随机顺序进行。

edit:以下是如何计算最短路径的数量。 我们之前注意到有 18 个操作;其中9个是to the right,9个是down。这些操作的顺序无关紧要,因为最后您已将(9, 9) 添加到初始(0, 0),因此您实际上到达了末尾。我们如何计算它们?让我们为每个操作分配一个标识符:a_1, a_2, ... a_18。我们现在要选择其中的 9 个操作作为 down。所以我们选择第一个位置进行down 操作,我们可以用 18 种方式进行操作(因为有 18 种操作可供选择),然后是第二个位置(17 方式),依此类推,直到我们用完 @987654335 @ 操作。我们可以以18*17*...*10 的方式做到这一点。现在我们为right 操作选择点。我们可以(通过 aology)以9*8*...*1 方式这样做。但是现在我们并没有真正区分每个down 指令,是吗?我们可以以9 方式选择第一个down 操作,以8 方式选择第二个操作,依此类推。同样,我们可以选择right 操作。最后我们推断有(18*17*...*1)/((9*8*...*1)*(9*8*...*1)) = 48 620 这样做的方式(我们除以对我们来说没有意义的操作区分)。这也是您可以从18 点中选择9 的方式的数量。

如果我的解释对你来说太混乱了,我可以推荐看看Introductory combinatorics by Richard A. Brualdi。这是一本关于离散数学某些领域的有趣事物的非常酷的书。它很容易阅读。

【讨论】:

  • m 很难理解解释。但是,如果您能提出一个好的算法来为这种情况提供最短路径,那就太好了
  • 您的算法实际上找到了最短路径,但您将其丢弃。要找到最短路径,您应该存储对正在处理的 Cell 的引用,然后将当前路径添加到队列中。因此,例如 Cell (1, 0) 应该持有对 Cell (0, 0) 的引用。这样,您可以通过最短路径(尽管向后)走回网格。尝试让算法也穿过对角线,它会找到路径(0, 0) -&gt; (1, 1) -&gt; ... -&gt; (9, 9)
  • 对不起。如果您能指出我的代码需要更正的地方,那就太好了
  • Cell 类中添加一个名为 previousCell 的 Cell 类型的成员。当您将 Cell 添加到队列中时(为 start 元素保存),将先前未访问的 CellpreviousCell 成员设置为 c。当您的BFSearch 返回时,您应该递归地写入previousCell 的坐标,从(9, 9) 开始,并在它设置为null 时结束。看看它打印了什么。然后将(1, 1)添加到表格移动并进行比较。
  • 我只想对 Lared 完成我的游戏表示衷心的感谢。 play.google.com/store/apps/…
【解决方案2】:

根据我对其他答案(lared 的这个)的理解,您的代码可能看起来像这样:

package com.example.game.bfs.alogrithm;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;


/**
   http://stackoverflow.com/questions/27768394/breadth-first-search-is-not-returning-the-shortest-path
 **/
public class BFS {

static class Cell {
    private int x;
    private int y;
    private String value;
    private boolean visitStatus;
    private Cell previousCell;

    public Cell(int x, int y, String value,boolean visitStatus) {
        this.x = x;
        this.y = y;
        this.value = value; 
        this.visitStatus=visitStatus;
    }

    public String toString()
    {
    return  "[" +   x + "," +   y + "]";
    }
}

private Cell[][] board;

private List<Cell> visited = new ArrayList<Cell>();

private boolean testDone;

public void setBoard(Cell[][] board) {
    this.board = board;
} 

public Cell getAdjacentUnvisitedCell(Cell cell)
{  
    int moves[][] = { { -1, 0 }, { 0, -1 }, { 1, 0 }, { 0, 1 } };
    // for diagonal moves :
    // int moves[][] = { { -1, 0 }, { 0, -1 }, { 1, 0 }, { 0, 1 }, {1,1} };
   for (int n = 0; n < moves.length ; ++n) {
       int ti = cell.x + moves[n][0];
       int tj = cell.y + moves[n][1];
      // System.out.println("ti,tj" + ti +"," + tj );  

       if (ti >= 0 && ti < board.length && tj >= 0 && tj < board[0].length) { 

          // System.out.println("getAdjacentUnvisitedCell : " + "[" + board[ti][tj].x + "," + board[ti][tj].y + "]" ); 
          // System.out.println("getAdjacentUnvisitedCell : board[ti][tj].visitStatus " + board[ti][tj].visitStatus ); 

           if(!board[ti][tj].visitStatus) {  
              return board[ti][tj];
           }
       }
   }  
   return null;  
} 

public void BFSearch(Cell start, Cell end) {  
   // BFS uses Queue data structure 
   Queue<Cell> q = new LinkedList<Cell>(); 
   Cell unVisitedadjCell = start; 
   Cell c =  null;
   q.add(start);
   visited.add(start);
   board[start.x][start.y].visitStatus = true;

   //printNode(start);

   while( !q.isEmpty() )
   { 
      c = q.peek(); 
      unVisitedadjCell = getAdjacentUnvisitedCell(c); 

      if(!testDone){
          testDone=true;  
      } 

      if ( unVisitedadjCell != null )
      {  visited.add(unVisitedadjCell); 
         board[unVisitedadjCell.x][unVisitedadjCell.y].visitStatus = true;

         printNode(unVisitedadjCell,c);
         unVisitedadjCell.previousCell=c; 
         q.add(unVisitedadjCell);
      }
      else
      {
         q.remove();
      }
   }
   System.out.println("Shortest path");

   while ( ( c != null ) && ( c!=start))
       {
       printNode(c.previousCell,c);
       c = c.previousCell;
       }

   visited.clear();     //Clear visited property of nodes
}


private void printNode(Cell c,Cell node) {
    System.out.println("For Node " + node.x +"," + node.y + ",  " + "Just Visited : " + c + " previous was " + node.previousCell);
} 

public static void main(String[] args) {
    Cell[][] cells = new Cell[10][10];
    for (int i = 0; i < 10; i++) {
        for (int j = 0; j < 10; j++) {
            cells[i][j] = new Cell(i, j, "defaultvalue",false);
        }
    }
    cells[0][1].value = "B";
    cells[0][2].value = "B";
    cells[1][1].value = "B";
    cells[1][3].value = "B";
    cells[2][1].value = "B";
    cells[2][2].value = "B";
    cells[2][3].value = "B";
    cells[2][7].value = "B";
    cells[2][8].value = "B"; 

    BFS board = new BFS();
    board.setBoard(cells);

    board.BFSearch(cells[0][0], cells[1][4]);
}


}

java -cp 。 com.example.game.bfs.alogrithm.BFS

For Node 0,0,  Just Visited : [1,0] previous was null
For Node 0,0,  Just Visited : [0,1] previous was null
For Node 1,0,  Just Visited : [2,0] previous was [0,0]
For Node 1,0,  Just Visited : [1,1] previous was [0,0]
For Node 0,1,  Just Visited : [0,2] previous was [0,0]
For Node 2,0,  Just Visited : [3,0] previous was [1,0]
For Node 2,0,  Just Visited : [2,1] previous was [1,0]
For Node 1,1,  Just Visited : [1,2] previous was [1,0]
For Node 0,2,  Just Visited : [0,3] previous was [0,1]
For Node 3,0,  Just Visited : [4,0] previous was [2,0]
For Node 3,0,  Just Visited : [3,1] previous was [2,0]
For Node 2,1,  Just Visited : [2,2] previous was [2,0]
For Node 1,2,  Just Visited : [1,3] previous was [1,1]
For Node 0,3,  Just Visited : [0,4] previous was [0,2]
For Node 4,0,  Just Visited : [5,0] previous was [3,0]
For Node 4,0,  Just Visited : [4,1] previous was [3,0]
For Node 3,1,  Just Visited : [3,2] previous was [3,0]
For Node 2,2,  Just Visited : [2,3] previous was [2,1]
For Node 1,3,  Just Visited : [1,4] previous was [1,2]
For Node 0,4,  Just Visited : [0,5] previous was [0,3]
For Node 5,0,  Just Visited : [6,0] previous was [4,0]
For Node 5,0,  Just Visited : [5,1] previous was [4,0]
For Node 4,1,  Just Visited : [4,2] previous was [4,0]
For Node 3,2,  Just Visited : [3,3] previous was [3,1]
For Node 2,3,  Just Visited : [2,4] previous was [2,2]
For Node 1,4,  Just Visited : [1,5] previous was [1,3]
For Node 0,5,  Just Visited : [0,6] previous was [0,4]
For Node 6,0,  Just Visited : [7,0] previous was [5,0]
For Node 6,0,  Just Visited : [6,1] previous was [5,0]
For Node 5,1,  Just Visited : [5,2] previous was [5,0]
For Node 4,2,  Just Visited : [4,3] previous was [4,1]
For Node 3,3,  Just Visited : [3,4] previous was [3,2]
For Node 2,4,  Just Visited : [2,5] previous was [2,3]
For Node 1,5,  Just Visited : [1,6] previous was [1,4]
For Node 0,6,  Just Visited : [0,7] previous was [0,5]
For Node 7,0,  Just Visited : [8,0] previous was [6,0]
For Node 7,0,  Just Visited : [7,1] previous was [6,0]
For Node 6,1,  Just Visited : [6,2] previous was [6,0]
For Node 5,2,  Just Visited : [5,3] previous was [5,1]
For Node 4,3,  Just Visited : [4,4] previous was [4,2]
For Node 3,4,  Just Visited : [3,5] previous was [3,3]
For Node 2,5,  Just Visited : [2,6] previous was [2,4]
For Node 1,6,  Just Visited : [1,7] previous was [1,5]
For Node 0,7,  Just Visited : [0,8] previous was [0,6]
For Node 8,0,  Just Visited : [9,0] previous was [7,0]
For Node 8,0,  Just Visited : [8,1] previous was [7,0]
For Node 7,1,  Just Visited : [7,2] previous was [7,0]
For Node 6,2,  Just Visited : [6,3] previous was [6,1]
For Node 5,3,  Just Visited : [5,4] previous was [5,2]
For Node 4,4,  Just Visited : [4,5] previous was [4,3]
For Node 3,5,  Just Visited : [3,6] previous was [3,4]
For Node 2,6,  Just Visited : [2,7] previous was [2,5]
For Node 1,7,  Just Visited : [1,8] previous was [1,6]
For Node 0,8,  Just Visited : [0,9] previous was [0,7]
For Node 9,0,  Just Visited : [9,1] previous was [8,0]
For Node 8,1,  Just Visited : [8,2] previous was [8,0]
For Node 7,2,  Just Visited : [7,3] previous was [7,1]
For Node 6,3,  Just Visited : [6,4] previous was [6,2]
For Node 5,4,  Just Visited : [5,5] previous was [5,3]
For Node 4,5,  Just Visited : [4,6] previous was [4,4]
For Node 3,6,  Just Visited : [3,7] previous was [3,5]
For Node 2,7,  Just Visited : [2,8] previous was [2,6]
For Node 1,8,  Just Visited : [1,9] previous was [1,7]
For Node 9,1,  Just Visited : [9,2] previous was [9,0]
For Node 8,2,  Just Visited : [8,3] previous was [8,1]
For Node 7,3,  Just Visited : [7,4] previous was [7,2]
For Node 6,4,  Just Visited : [6,5] previous was [6,3]
For Node 5,5,  Just Visited : [5,6] previous was [5,4]
For Node 4,6,  Just Visited : [4,7] previous was [4,5]
For Node 3,7,  Just Visited : [3,8] previous was [3,6]
For Node 2,8,  Just Visited : [2,9] previous was [2,7]
For Node 9,2,  Just Visited : [9,3] previous was [9,1]
For Node 8,3,  Just Visited : [8,4] previous was [8,2]
For Node 7,4,  Just Visited : [7,5] previous was [7,3]
For Node 6,5,  Just Visited : [6,6] previous was [6,4]
For Node 5,6,  Just Visited : [5,7] previous was [5,5]
For Node 4,7,  Just Visited : [4,8] previous was [4,6]
For Node 3,8,  Just Visited : [3,9] previous was [3,7]
For Node 9,3,  Just Visited : [9,4] previous was [9,2]
For Node 8,4,  Just Visited : [8,5] previous was [8,3]
For Node 7,5,  Just Visited : [7,6] previous was [7,4]
For Node 6,6,  Just Visited : [6,7] previous was [6,5]
For Node 5,7,  Just Visited : [5,8] previous was [5,6]
For Node 4,8,  Just Visited : [4,9] previous was [4,7]
For Node 9,4,  Just Visited : [9,5] previous was [9,3]
For Node 8,5,  Just Visited : [8,6] previous was [8,4]
For Node 7,6,  Just Visited : [7,7] previous was [7,5]
For Node 6,7,  Just Visited : [6,8] previous was [6,6]
For Node 5,8,  Just Visited : [5,9] previous was [5,7]
For Node 9,5,  Just Visited : [9,6] previous was [9,4]
For Node 8,6,  Just Visited : [8,7] previous was [8,5]
For Node 7,7,  Just Visited : [7,8] previous was [7,6]
For Node 6,8,  Just Visited : [6,9] previous was [6,7]
For Node 9,6,  Just Visited : [9,7] previous was [9,5]
For Node 8,7,  Just Visited : [8,8] previous was [8,6]
For Node 7,8,  Just Visited : [7,9] previous was [7,7]
For Node 9,7,  Just Visited : [9,8] previous was [9,6]
For Node 8,8,  Just Visited : [8,9] previous was [8,7]
For Node 9,8,  Just Visited : [9,9] previous was [9,7]
Shortest path
For Node 9,9,  Just Visited : [9,8] previous was [9,8]
For Node 9,8,  Just Visited : [9,7] previous was [9,7]
For Node 9,7,  Just Visited : [9,6] previous was [9,6]
For Node 9,6,  Just Visited : [9,5] previous was [9,5]
For Node 9,5,  Just Visited : [9,4] previous was [9,4]
For Node 9,4,  Just Visited : [9,3] previous was [9,3]
For Node 9,3,  Just Visited : [9,2] previous was [9,2]
For Node 9,2,  Just Visited : [9,1] previous was [9,1]
For Node 9,1,  Just Visited : [9,0] previous was [9,0]
For Node 9,0,  Just Visited : [8,0] previous was [8,0]
For Node 8,0,  Just Visited : [7,0] previous was [7,0]
For Node 7,0,  Just Visited : [6,0] previous was [6,0]
For Node 6,0,  Just Visited : [5,0] previous was [5,0]
For Node 5,0,  Just Visited : [4,0] previous was [4,0]
For Node 4,0,  Just Visited : [3,0] previous was [3,0]
For Node 3,0,  Just Visited : [2,0] previous was [2,0]
For Node 2,0,  Just Visited : [1,0] previous was [1,0]
For Node 1,0,  Just Visited : [0,0] previous was [0,0]

然后尝试使用带有对角线的注释代码...

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-23
  • 2018-12-25
  • 2017-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多