2013-02-04 115 views
0

我正致力于计算出我可以放在nxn棋盘上的主教队伍的最大数量,而不会让他们互相攻击。我无法检查对角线。以下是我检查对角线的方法。主教目前所在的格子被标记为真,所以该方法应该检查对角线,如果它返回true,那么放置主教的方法将移动到下一行。Java主教国际象棋棋盘

林不知道怎么回事,任何帮助将不胜感激。

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

搜索 “回溯” 规划算法。这是一个递归的。经常在学校用作功课,在实践中...几乎从不...... – 2013-02-04 04:27:58

+0

这与[N-Queens问题](http://www.math.utah.edu/~alfeld/queens/queens.html)非常相似,并且你可能想看看它。遗传算法或爬山将成为你的朋友。 –

回答

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

现在,当你复制粘贴+你的循环,你只需要改变如何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); 
} 
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