【问题标题】:Java Bishop Chess BoardJava 象棋棋盘
【发布时间】:2013-02-04 04:24:50
【问题描述】:

我正在努力计算我可以在 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;
}

【问题讨论】:

  • 搜索“回溯”编程算法。这是一个递归的。经常在学校用于家庭作业、练习......几乎从不
  • 这与N-Queens Problem 非常相似,您可能想看看它。遗传算法或爬山将成为您的朋友。

标签: java algorithm chess


【解决方案1】:
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);
}

【讨论】:

    【解决方案2】:

    可能不是预期的答案,但没有理由让生活变得如此复杂。

    我正在研究我可以在 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-28
      • 1970-01-01
      相关资源
      最近更新 更多