我正在努力确定我可以放在nxn板上的主教的最大数量,而不会让他们互相攻击。我无法检查对角线。下面是检查对角线的方法。主教当前所在的方块被标记为真,因此该方法应该检查对角线,如果它返回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;
}
答案 0 :(得分:2)
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循环时,您只需要更改newrow
和newcolumn
的计算方式,其他所有内容(包括循环变量名称)都是相同的。复制+粘贴时编辑的越少越好。我们还尝试了所有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);
}
答案 1 :(得分: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;
}