有一个网格。
static Double [][] myTiles = new Double[row][column];
目标是将每个图块与相邻图块连接。比较该对之间的值,在图块之间构造一个链接,以创建给定网格的最小生成树。
以下是我针对此问题的初步方法:
识别出九(9)组瓷砖。
这些组具有相同的逻辑,并且相邻正方形的可用性相同。
对于我网格中的每个单元格,我决定在上方,下方,左侧和右侧检查一个单元格。当某些细胞不能执行所有检查位于上边缘的网格。下面是每种图块的运动表示。
我当前的解决方案是使用以下if-else语句的嵌套for循环:
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块?
最有效的方法是限制每个图块创建的链接数量。
为了使逻辑产生更少的重复,逃避嵌套循环解决方案,而是实现两个单独的 for循环是有帮助的。
第一步:逐行遍历每一行的每个图块,并向东或向左建立一个链接,直到检测到边缘。当检测到边缘,跳过指针一行向下。
第二步:逐行遍历每一列的每个图块,并向南或向下建立一个链接,直到检测到边缘。当检测到边缘时,将指针向右跳一列。
此逻辑覆盖所有图块,防止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