0

相互に攻撃することなく、nxnボードに配置できるビショップの最大数を把握することに取り組んでいます. 対角線のチェックに問題があります。以下は、対角線を確認する私の方法です。ビショップが現在ある正方形は true としてマークされているため、メソッドは対角線をチェックすることになっています。true が返された場合、ビショップを配置するメソッドは次の行に移動します。

何がうまくいかないのかよくわかりません。助けていただければ幸いです。

private boolean bishopAttack(int row, int column)
{
    int a,b,c;

    for(a = 1; a <= column; a++)
    {
        if(row<a)
        {
            break;
        }

        if(board[row-a][column-a])
        {
            return true;
        }
    }   
    for(b = 1; b <= column; b++)
    {
        if(row<b)
        {
            break;
        }
        if(board[row+b][column-b])
        {
            return true;
        }
    }   
    for(c = 1; b <= column; b++)
    {
        if(row<c)
        {
            break;
        }
        if(board[row+c][column+c])
        {
            return true;
        }
    }
    return false;
}
4

2 に答える 2

2
for(c = 1; b <= column; b++)

そうじゃないかな

for(c = 1; c <= column; c++)

ところで:

1)a、b、cなどの代わりにi、j、kを使用します。理由はありません...それは単なる慣例です。

2) 新しい変数に名前を付け続ける必要はありません。次のようなことを試してください:

for(int i = 1; i <= column; i++)
{
    ...
}
//because i was declared in the for loop, after the } it no longer exists and we can redeclare and reuse it
for(int i = 1; i <= column; i++)
{
    ...
}

3) エラー チェックが正しくありません。次のようになります。

for(int i = 1; i < 8; i++)
{
    int newrow = row - i;
    int newcolumn = column - i;
    if (newrow < 0 || newrow > 7 || newcolumn < 0 || newcolumn > 7)
    {
       break;
    }
    if (board[newrow][newcolumn])
    {
        return true;
    }
}

newrowforループをコピーして貼り付けると、計算方法と計算方法を変更するだけnewcolumnで、他のすべて(ループ変数名を含む)は同じになります。コピーして貼り付けるときに編集する必要が少ないほど、優れています。また、終了条件を変更する必要がないように、7 つの正方形すべてを試行します。いずれかの方向に範囲外に出ようとすると、ループ内の if チェックによって停止されます。

4) もちろん、for ループを 1 回だけ使用し、変化するものだけをそれに渡す方がよいでしょう...

private boolean bishopAttackOneDirection(int rowdelta, int coldelta, int row, int column)
{
    for(int i = 1; i < 8; i++)
    {
        int newrow = row + rowdelta*i;
        int newcolumn = column + columndelta*i;
        if (newrow < 0 || newrow > 7 || newcolumn < 0 || newcolumn > 7)
        {
           break;
        }
        if (board[newrow][newcolumn])
        {
            return true;
        }
    }
    return false;
}

private boolean BishopAttack(int row, int column)
{
   return BishopAttackInOneDirection(-1, -1, row, column)
   || BishopAttackInOneDirection(1, -1, row, column)
   || BishopAttackInOneDirection(1, 1, row, column)
   || BishopAttackInOneDirection(-1, 1, row, column);
}
于 2013-02-04T04:29:34.303 に答える
1

おそらく期待通りの答えではないでしょうが、人生をこれほど複雑にする理由はありません。

相互に攻撃することなく、nxnボードに配置できるビショップの最大数を把握することに取り組んでいます.

public int getMaximumNumberOfNonAttackingBishopsForSquareBoardSize(final int boardSize) {
    if (boardSize < 2 || boardSize > (Integer.MAX_VALUE / 2))
        throw new IllegalArgumentException("Invalid boardSize, must be between 2 and " + Integer.MAX_VALUE / 2 + ", got: " + boardSize);
    return 2 * boardSize - 2;
}

ソース: http://mathworld.wolfram.com/BishopsProblem.html

于 2013-02-04T12:35:07.947 に答える