【问题标题】:Efficient way of linking grid tiles while creating distinct edges in Java在 Java 中创建不同边缘时链接网格图块的有效方法
【发布时间】:2020-12-04 17:42:28
【问题描述】:

有一个网格

static Double [][] myTiles = new Double[row][column];

目标是将每个图块与相邻图块连接比较这对之间的值,构造图块之间的链接以创建给定网格的最小生成树

以下是我对这个问题的初步方法

已识别九 (9) 组图块。

这些组具有相同的逻辑和相同的相邻方格可用性。

对于我网格中的每个单元格,我决定检查一个单元格上方下方,到左侧右边。 当位于网格的边缘上时,某些单元格无法执行所有检查。下面是每种类型的图块的移动表示。

我当前的解决方案是 嵌套的 for 循环,其中包含以下 if-else 语句

            if ( row == 0 && column == 0)   {
                mySortingQueue.offer(createEdgeSouth(myEdge, myTiles, row, column));
                mySortingQueue.offer(createEdgeEast(myEdge, myTiles, row, column));     }
            
            else if ( row == 0 && ( column > 0 && column < myTiles.length ) )   {
                mySortingQueue.offer(createEdgeSouth(myEdge, myTiles, row, column));
                mySortingQueue.offer(createEdgeEast(myEdge, myTiles, row, column));
                mySortingQueue.offer(createEdgeWest(myEdge, myTiles, row, column));     }
            
            else if ( row == 0 && column == myTiles.length )    {
                mySortingQueue.offer(createEdgeSouth(myEdge, myTiles, row, column));
                mySortingQueue.offer(createEdgeWest(myEdge, myTiles, row, column));     }
            
            else if ( ( row > 0 && row < myTilese[row].length ) && column == 0 )    {
                mySortingQueue.offer(createEdgeSouth(myEdge, myTiles, row, column));
                mySortingQueue.offer(createEdgeEast(myEdge, myTiles, row, column));
                mySortingQueue.offer(createEdgeNorth(myEdge, myTiles, row, column));    }
            
            else if ( row == myTilese[row].length && column == 0 )  {
                mySortingQueue.offer(createEdgeEast(myEdge, myTiles, row, column));
                mySortingQueue.offer(createEdgeNorth(myEdge, myTiles, row, column));    }
            
            else if ( row == myTilese[row].length && ( column > 0 && column < myTiles.length ) )    {
                mySortingQueue.offer(createEdgeNorth(myEdge, myTiles, row, column));
                mySortingQueue.offer(createEdgeEast(myEdge, myTiles, row, column));
                mySortingQueue.offer(createEdgeWest(myEdge, myTiles, row, column));     }
            
            else if ( row == myTilese[row].length &&  column == myTiles.length )    {
                mySortingQueue.offer(createEdgeNorth(myEdge, myTiles, row, column));
                mySortingQueue.offer(createEdgeWest(myEdge, myTiles, row, column));     }
            
            else if ( ( row > 0 &&  row < myTilese[row].length ) && column == myTiles.length )  {
                mySortingQueue.offer(createEdgeNorth(myEdge, myTiles, row, column));
                mySortingQueue.offer(createEdgeWest(myEdge, myTiles, row, column));
                mySortingQueue.offer(createEdgeSouth(myEdge, myTiles, row, column));}
            
            else    {
                mySortingQueue.offer(createEdgeNorth(myEdge, myTiles, row, column));
                mySortingQueue.offer(createEdgeEast(myEdge, myTiles, row, column));
                mySortingQueue.offer(createEdgeWest(myEdge, myTiles, row, column));
                mySortingQueue.offer(createEdgeSouth(myEdge, myTiles, row, column));}

上述逻辑至少创建两个链接,最多四个。 在构建最小生成树时,需要排序很多重复项。

上面的 if-else 块有没有一种雄辩的方式来表示?

【问题讨论】:

  • 您经常使用 condition &&。我会使用嵌套的 if 语句将条件组合在一起。
  • 它将相似的代码组合在一起。这使得可以用新方法替换哪些代码位变得更加明显。然而,这并没有硬性规定。你要求推荐更雄辩的代码,我给了你一个。如果您想了解更多信息,请在网上 Google。

标签: java multidimensional-array grid row


【解决方案1】:

这要简单得多:

if(row > 0) {
    // north
}
if(row < height) {
    // south
}
if(column > 0) {
    // west
}
if(column < width) {
    // east
}

显然,这假设您至少有一个 2x2 网格。

我认为您对您的实现进行了过度思考,但是您发布的代码可以很容易地重构为一个好的测试用例。

【讨论】:

    【解决方案2】:

    最有效的方法是限制每个图块创建的链接数量。

    为了使逻辑产生更少的重复,避免嵌套循环解决方案是有帮助的,而是实现两个单独的 for循环

    第一步:逐列遍历每个图块每一行,并创建一个链接向东或离开直到检测到边缘。当检测到边缘时,跳过指针一行向下

    第二步:逐行遍历每一个tile每一列,做一个链接 或向下直到检测到边缘。当检测到边缘时,跳过指针一列向右

    此逻辑覆盖所有图块,防止 IndexOutOfBoundsChecks,并减少创建的重复链接数量。

            for ( tileColumn = 0; tileColumn < 74; tileColumn ++ )  {
                myEdge = new GraphEdge<String>();
                
                mySortingQueue.offer(createEdgeEast(myEdge, myTiles, tileRow, tileColumn));
                
                if ( tileColumn == 73 && tileRow < 34 ) {   
                    tileColumn = 0;
                    tileRow++;  }
            }   /*  End of the column for loop  */
            
            tileRow = ZERO;
            tileColumn = ZERO;
            
            for ( tileRow = 0; tileRow < 34; tileRow++ )    {
                myEdge = new GraphEdge<String>();
                mySortingQueue.offer(createEdgeSouth(myEdge, myTiles, tileRow, tileColumn));
                
                if ( tileRow == 33 && tileColumn < 74)  {   
                    tileRow = 0;
                    tileColumn++;   }
            }   // End of the row for loop
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-24
      • 2014-12-02
      • 2016-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-02
      相关资源
      最近更新 更多