2013-02-04 147 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