我正在研究最大的主教人数,我可以放在一个NXN板,而他们不能互相攻击。我检查对角线有困难。下面是我检查对角线的方法。当前主教所在的正方形被标记为真,因此该方法应检查对角线,如果返回真,则放置主教的方法将移到下一行。
我不太清楚出了什么问题,如有任何帮助将不胜感激。

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

最佳答案

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

不是吗
for(c = 1; c <= column; c++)

顺便说一句:
1)使用I、J、K代替A、B、C等。没有真正的原因…这只是惯例。
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;
    }
}

现在,当您复制并粘贴for循环时,只需更改newrownewcolumn的计算方式,其他所有内容(包括循环变量名)都将相同复制+粘贴时,编辑的次数越少越好我们还尝试所有7个方块,这样就不必更改结束条件-如果我们试图在任何方向越界,循环中的if检查将阻止我们。
4)当然,更好的方法是只使用for循环一次,只向它传递变化的东西……有点像。。。
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);
}

08-27 18:10