在java中创建不同边时链接网格块的有效方法

vnzz0bqm  于 2021-07-03  发布在  Java
关注(0)|答案(2)|浏览(364)

有一个网格。

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));}

上述逻辑至少创建两个链接,最多创建四个链接。在构建最小生成树的时候,有很多问题需要解决。
是否有一个雄辩的方式来代表上述如果否则块?

icnyk63a

icnyk63a1#

最有效的方法是限制每个磁贴创建的链接数量。
为了使逻辑产生较少的重复,可以避开嵌套循环解决方案,而是实现两个单独的循环。
第一步:逐列遍历每一个图块的每一行,并向东或向左创建一个链接,直到检测到边缘。当检测到边缘时,将指针向下跳一行。
第二步:逐行遍历每一个图块的每一列,并向南或向下建立一个链接,直到检测到边缘。当检测到边缘时,将指针向右跳过一列。

这个逻辑覆盖所有的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
d7v8vwbk

d7v8vwbk2#

这要简单得多:

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

显然,这假设您至少有一个2x2网格。
我认为您对实现的考虑太多了,但是您发布的代码可以很容易地进行重构以生成一个好的测试用例。

相关问题