Knight's Tour問題を解決しようとすることに基づいてプログラムを作成しました。私は適切な解決策を思いついたと信じており、すべてがうまくいっています。
私が興味を持っている小さな問題は、将来の可能な正方形を先取りすることに基づいて最善の動きを実装するコードの小さなセクションにあります。
このように実装すると (implementation1)–</p>
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) を行う場合 –</p>
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' とコマンドラインのみを使用してコンパイルしようとしましたが、同じ結果が得られました。このような配列パラメータ内でこのメソッド呼び出しを行うことができない理由がわかりません – 垂直 [ HERE ] または水平 [ HERE ] 式で使用される結果を返します。以前は問題なくこのようにコーディングできました。
呼び出されるメソッドは次のとおりです。</p>
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 );
}
上記の return ステートメントで使用されるメソッド 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;
}