在Java中创建不同边的同时链接网格分幅的有效方法
有一个网格在Java中创建不同边的同时链接网格分幅的有效方法,java,multidimensional-array,grid,row,Java,Multidimensional Array,Grid,Row,有一个网格 static Double [][] myTiles = new Double[row][column]; 目标是将每个磁贴与相邻磁贴连接起来比较两个图块之间的值,在图块之间构建链接,为给定网格创建最小生成树 以下是我对这个问题的初步看法: 确定了九(9)组瓷砖 这些组具有相同的逻辑和相邻方块的相同可用性 对于网格中的每个单元格,我决定检查上面、下面、左边和右边的一个单元格。 某些单元格位于网格的边缘时无法执行所有检查。下面是每种类型的平铺的移动表示 我当前的解决方案是一个嵌套
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(行==0&&column==0){
offer(CreateEdgeOuth(myEdge、myTiles、行、列));
提供(createEdgeEast(myEdge,myTiles,行,列));}
else if(行==0&(列>0&&column0&&row0&&column0&&row
上述逻辑创建了至少两个链接,最多四个链接。
当涉及到构建最小生成树时,有很多问题需要解决
是否有一种雄辩的方式来表示上述if-else块?这要简单得多:
if(行>0){
//北
}
如果(行<高度){
//南方
}
如果(列>0){
//西部
}
如果(列<宽度){
//东边
}
显然,这假设您至少有一个2x2网格
我认为您考虑过了您的实现,但是您发布的代码可以很容易地进行重构以生成一个好的测试用例。最有效的方法是限制每个互动程序创建的链接数量 为了使逻辑产生更少的重复项,避开嵌套循环解决方案,并为循环实现两个独立的,这是很有帮助的
static Double [][] myTiles = new Double[row][column];
第一步:逐列逐行遍历每一个磁贴,并向东或向左链接,直到检测到边缘。检测到边缘时,将指针向下跳过一行
第二步:逐行遍历每列的每个磁贴,并向南或向下链接一个链接,直到检测到边缘。检测到边缘时,将指针向右跳过一列
此逻辑覆盖所有分幅,防止索引自动边界检查,并减少创建的重复链接量
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
for(tileColumn=0;tileColumn<74;tileColumn++){
myEdge=新的GraphEdge();
offer(createEdgeEast(myEdge、myTiles、tileRow、tileColumn));
如果(tileColumn==73&&tileRow<34){
tileColumn=0;
tileRow++;}
}/*循环列的末尾*/
tileRow=零;
tileColumn=零;
对于(tileRow=0;tileRow<34;tileRow++){
myEdge=新的GraphEdge();
提供(CreateEdgeOuth(myEdge、myTiles、tileRow、tileColumn));
如果(tileRow==33&&tileColumn<74){
tileRow=0;