你如何测试n-queens中的对角线?

时间:2013-10-22 17:08:15

标签: c++ n-queens

我正在研究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;
}

2 个答案:

答案 0 :(得分:7)

delta_row =两个皇后之间的行差异,delta_col =列的差异。如果delta_row == delta_coldelta_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;
}

希望这有帮助!!!