2012-11-13 87 views
2

我已經編寫了一個基於試圖解決Knight's Tour問題的程序。我相信我已經提出了一個合適的解決方案,一切都很好。數組語句中的方法調用導致程序「掛起」

我很好奇的一個小問題是一小部分代碼實現了基於展望未來可能的廣場的最佳舉措。

如果我實現它像這樣(implementation1) -

if(moveMade) // if any move is possible 
{ 
    currentRow += vertical[ betterMove(valueMatrix, horizontal, vertical, accessibility, currentRow, currentColumn) ]; 
    currentColumn += horizontal[ betterMove(valueMatrix, horizontal, vertical, accessibility, currentRow, currentColumn) ]; 
    board[ currentRow ][ currentColumn ] = squareCounter; 
    squareCounter++; 
    moveMade = false; 
} 
else 
moveMade = true; // if there are no moves possible this is the end 

軟件將掛起 - 爲什麼?

如果我做一個小無毒,看似微不足道的變化,如本(implementation2) -

int temp1 = betterMove(valueMatrix, horizontal, vertical, accessibility, currentRow, currentColumn); 

if(moveMade) // if any move is possible 
{ 
    currentRow += vertical[ temp1 ]; 
    currentColumn += horizontal[ temp1 ]; 
    board[ currentRow ][ currentColumn ] = squareCounter; 
    squareCounter++; 
    moveMade = false; 
} 
else 
    moveMade = true; // if there are no moves possible this is the end 

那麼一切都很好,代碼將達到它的結論。

我使用NetBeans 7.1來寫我的軟件,並認爲這一定是什麼做的IDE,所以我嘗試使用只是「的javac」和命令行才發現相同的結果進行編譯。我不明白爲什麼我不能在像這樣的數組參數內調用此方法 - vertical [HERE]或horizo​​ntal [HERE],並得到在表達式中使用的返回結果。我已經設法編寫這樣的代碼,沒有任何問題。

這裏是被調用的方法 -

public static int betterMove(int moverMatrix[], int theHorizontal[], int theVertical[], int accessBoard[][], int newCurrentRow, int newCurrentColumn) 
{ 
    int[] equalMatrix = new int [ 8 ]; // records the positions which are equal in value with a (1) 
    int[] bmValueMatrix = new int[ 8 ]; // holds the numbers taken from accessibility heuristic 
    int[] finalTable = new int[ 8 ]; // the best move discovered 
    int best = bestMove(moverMatrix); // the lowest number in the given array 
    int startPos = best + 1; 
    int moveNumber = 0; 
    int originalCurrentRow = newCurrentRow; 
    int originalCurrentColumn = newCurrentColumn; 

    equalMatrix[ best ] = 1; // mark the lowest value position with a 1 

    initVMatrix(bmValueMatrix); 
    initVMatrix(finalTable); 

    for(int i = startPos; i < 8; i++) // mark the elements of equal value in equalMatrix with (1) 
    { 
     if(moverMatrix[ best ] == moverMatrix[ i ]) 
      equalMatrix[ i ] = 1; 
    } 

    for(int j = 0; j < 8; j++) // go through each element of equalMatrix and look forward 
    {        // for best accessibility heuristic 
     newCurrentRow = originalCurrentRow; 
     newCurrentColumn = originalCurrentColumn; 
     if(equalMatrix[ j ] == 1) 
     { 
      newCurrentRow += theVertical[ j ]; 
      newCurrentColumn += theHorizontal[ j ]; 
      while(moveNumber < 8) 
      { 
       if(newCurrentRow + theVertical[ moveNumber ] >= 0 && 
         newCurrentRow + theVertical[ moveNumber ] < 8) 
       { 
        if(newCurrentColumn + theHorizontal[ moveNumber ] >= 0 && 
          newCurrentColumn + theHorizontal[ moveNumber ] < 8) 
        { 
         bmValueMatrix[ moveNumber ] = accessBoard[ newCurrentRow + theVertical[ moveNumber ] ] 
                    [ newCurrentColumn + theHorizontal[ moveNumber ] ]; 
        } // end if 
       } // end if 
       moveNumber++; 
      } // end while 
      moveNumber = 0; 
      finalTable[ j ] = bestMove(bmValueMatrix); 
      initVMatrix(bmValueMatrix); 
     } // end if 

    } // end for 
    return bestMove(finalTable); 
} 

bestmove在返回語句中使用以上所述的方法 - 同時爲陣列

public static int bestMove(int theMoves[]) 
{ 
    int theLowest = 10, 
     idealMove = 0; 

    for(int i = 0; i < 8; i++) 
    { 
     if(theMoves[ i ] < theLowest) 
     { 
      theLowest = theMoves[i]; 
      idealMove = i; 
     } 
    } 
    return idealMove; 
} 

回答

4
currentRow += vertical[ betterMove(valueMatrix, horizontal, vertical, accessibility, currentRow, currentColumn) ]; 
currentColumn += horizontal[ betterMove(valueMatrix, horizontal, vertical, accessibility, currentRow, currentColumn) ]; 

在上述情況下,index value不相同。

的問題是,由一次調用的betterMove方法的第二個時間內,currentRow值已發生變化,如你在你的方法傳遞currentRow作爲paramters之一,因此,其用於horizontal陣列index與您在if (moveMade)之外調用方法時使用的方法不同。

注意,區別僅在於2nd statement。第一個將在兩個方面相同。

所以,這可能是一個問題。

因此,您需要先存儲該方法執行的返回值,然後使用該返回值作爲verticalhorizontal數組的索引。

int temp1 = betterMove(valueMatrix, horizontal, vertical, accessibility, currentRow, currentColumn); 

if(moveMade) // if any move is possible 
{ 
    currentRow += vertical[ temp1 ]; 
    currentColumn += horizontal[ temp1 ]; 
    // Rest of the code 
} 
在這種情況下

現在,這兩個陣列具有相同index value - temp1。另外,如果您使用方法調用的返回值不止一次,並且該方法正在修改您的任何一個passed parameter,則應該總是調用該方法一次,並存儲返回值並使用它相當。這樣可以避免你目睹奇怪的結果。

+0

作爲增加了額外的,這個版本是相當的可讀性 – Tedil

相關問題