有一个网格。
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));}
上述逻辑至少创建两个链接,最多创建四个链接。在构建最小生成树的时候,有很多问题需要解决。
是否有一个雄辩的方式来代表上述如果否则块?
2条答案
按热度按时间icnyk63a1#
最有效的方法是限制每个磁贴创建的链接数量。
为了使逻辑产生较少的重复,可以避开嵌套循环解决方案,而是实现两个单独的循环。
第一步:逐列遍历每一个图块的每一行,并向东或向左创建一个链接,直到检测到边缘。当检测到边缘时,将指针向下跳一行。
第二步:逐行遍历每一个图块的每一列,并向南或向下建立一个链接,直到检测到边缘。当检测到边缘时,将指针向右跳过一列。
这个逻辑覆盖所有的tile,防止indexoutofboundschecks,并减少创建的重复链接的数量。
d7v8vwbk2#
这要简单得多:
显然,这假设您至少有一个2x2网格。
我认为您对实现的考虑太多了,但是您发布的代码可以很容易地进行重构以生成一个好的测试用例。