我正在研究n-queen回溯。有人可以向我解释other_row_pos
如何检查对角线?我不确定它为什么会起作用或者它是如何工作的。
取自wikibooks - http://en.wikibooks.org/wiki/Algorithm_Implementation/Miscellaneous/N-Queens:
bool isSafe(int queen_number, int row_position) {
// Check each queen before this one
for(int i=0; i<queen_number; i++) {
// Get another queen's row_position
int other_row_pos = position[i];
// Now check if they're in the same row or diagonals
if(other_row_pos == row_position || // Same row
other_row_pos == row_position - (queen_number-i) || // Same diagonal
other_row_pos == row_position + (queen_number-i)) // Same diagonal
return false;
}
return true;
}
答案 0 :(得分:7)
让delta_row
=两个皇后之间的行差异,delta_col
=列的差异。如果delta_row == delta_col
或delta_row == -delta_col
,则两个皇后将在同一对角线上。
使用您拥有的变量:
delta_row = other_row_pos - row_position
delta_col = queen_number - i
因此,如果出现以下情况,则皇后位于同一对角线上:
other_row_pos - row_position == queen_number - i ||
other_row_pos - row_position == -(queen_number - i)
如果将row_position
添加到相等的两边,则会在代码中获得条件:
other_row_pos == row_position + (queen_number-i) ||
other_row_pos == row_position - (queen_number-i)
答案 1 :(得分:1)
考虑你必须检查板元素(x,y)是否可以从任何对角线元素进行攻击。如果位于其对角元素上的任何元素是一个女王,则(x,y)可以被对角攻击。假设(p,q)是具有皇后的棋盘元素。元素(x,y)的现在条件位于棋盘的对角线坐标上element(p,q)将是p + q == x + y或pq == xy。这也可以解释为元素(p,q)和(x,y)位于同一对角线上的条件。所以,如果(p,q)有女王,我们必须检查(x,y)是否可以被这位女王攻击,其条件是: -
if((board[p][q] == 1 ) && ((p+q == x+y) || (p-q == x-y))){
return true;
}
检查(x,y)处的元素(即板[x,y]是否受对角线元素攻击)的完整函数将是: -
for(int p=1;p<board.length;p++){
for(int q=1;q<board.length;q++){
if(p==x && q==y){ //skipping check if element under consideration is same
continue;
}
if((board[p][q] == 1 )&& ((p+q == x+y) || (p-q == x-y))){
return true;
}
}
}
检查元素(x,y)是否受到攻击的完整函数是: -
public static boolean is_attacked(int x,int y,int board[][],int n){
for(int i = 1;i < board.length;i++){
if(board[x][i] == 1){ //if any cell in xth row is 1 i.e.,queen is there in that row
return true;
}
}
for(int i = 1;i < board.length;i++){
if(board[i][y] == 1){ //if any cell in yth column is 1 i.e.,queen is there in that column
return true;
}
}
for(int p=1;p<board.length;p++){
for(int q=1;q<board.length;q++){
if(p==x && q==y){
continue;
}
if((board[p][q]== 1 )&& ((p+q== x+y) || (p-q == x-y))){
return true;
}
}
}
return false;
}
希望这有帮助!!!