2

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;
}
4

1 に答える 1

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

上記の場合、index value両方の配列が同じではありません。

betterMove問題は、メソッドを2回目に呼び出すまでにcurrentRow値が変更されcurrentRow、メソッドをパラメーターの1つとして渡すため、配列にindex使用されるhorizontalものと同じではないことですの外部でメソッドを呼び出すときに使用されます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常にメソッドを 1 回呼び出して戻り値を保存し、代わりにそれを使用する必要があります。これにより、奇妙な結果を目の当たりにすることがなくなります。

于 2012-11-13T15:06:44.403 に答える