Java 按对角线方向检查n轴

Java 按对角线方向检查n轴,java,n-queens,Java,N Queens,我在理解网上的代码方面遇到了问题。这是女王检查是否与其他女王发生冲突。有人能给我解释一下这是干什么用的吗?第一个条件,我知道是检查同一行,但是绝对数呢 if ((board[i] == board[row]) || Math.abs(board[row] - board[i]) == (row - i)) { return false; } 以下是完整的代码: class NQueen { private int[] board; private int size; privat

我在理解网上的代码方面遇到了问题。这是女王检查是否与其他女王发生冲突。有人能给我解释一下这是干什么用的吗?第一个条件,我知道是检查同一行,但是绝对数呢

if ((board[i] == board[row]) || Math.abs(board[row] - board[i]) == (row - i)) 
{
     return false;
}
以下是完整的代码:

class NQueen {

private int[] board;
private int size;
private ArrayList allSolutions = null;

public int[] getBoard() {
    return board;
}
public ArrayList getAllSolutions() {
    return this.allSolutions;
}
public NQueen(int size) {
    this.size = size;
    board = new int[this.size];
    this.allSolutions = new ArrayList();
}
public void place(int row) {
            // base case
    if (row == size) {
        int[] temp = new int[size];
                    // copy in temp array
        System.arraycopy(board, 0, temp, 0, size);
                    // add to the list of solution
        allSolutions.add(new Solution(temp));
        return ;
    } else {
        for (int i = 0; i < size; i++) {

            board[row] = i;
                            /* when you place a new queen
                             * check if the row you add it in, isn't 
                             * already in the array. since the value of arrray is
                             * the row, so we only need to check the diagonals no need to check for collisions on the left or right. 
                             * As long as there is no duplicate values in the array.*/
            if (valid(row)){
                               place(row + 1);
                            }

        }
    }
}
public boolean valid(int row) {
    for (int i = 0; i < row; i++) {
                    // if same row  or same diagonal
        if ((board[i] == board[row]) || Math.abs(board[row] - board[i]) == (row - i)) 
                    {
                        return false;
        }
    }
    return true;
}

}

如果你有一个二维阵列,并且阵列中板单元上的每个位置都在同一对角线上,那么一个工件必须具有相同的水平和垂直距离

Math.abs(board[row] - board[i]) == (row - i)
确实如此。abs是因为第二块可以是左上角、右上角、右下角和左下角。不确定您的算法是如何实现的,但最好也取第二个操作数的绝对值

小电路板示例:

  1 2 3 4
1
2 x
3
4     y
这里的水平距离是2 abs1-3,垂直距离也是2 abs2-4

例2:

  1 2 3 4
1       x
2     y
3 
4 
这里我们只有水平和垂直距离,分别为1 abs4-3和1 abs1-2

跟进 您的数组在每个元素中存储该行中女王的位置。所以它只是一个一维数组,而不是我最初建议的二维数组

因此,对于我的第一个示例,您的数组将包含:

[ 0, 1, 0, 3 ]
我认为OP中的代码假定基于0的位置,但使用0新的int[size]初始化数组元素。这可能是一个错误,因为0是一个有效位置,可能与其他约束冲突,即如果上一行或下一行的皇后未初始化=位置0,则无法将皇后放置在索引1上

回到使用基于1的索引的示例中,为了清晰起见并避免上面提到的错误:a[2]-a[4]==1-3 a[2]==1,a[4]==3


如果将y段移到第2列,则会得到[2]-a[4]!=1-3,因为它们不共享对角线a[2]==1,a[4]==3

什么是板?它是什么类型的数组?它存储什么值?你想检查移动的哪一部分-水平、垂直或对角?将StackOverflow用户视为友好的邻居陌生人会很有帮助,他们对你的问题或代码一无所知。尽可能详细地解释您的问题。数组索引表示皇后所在的列,值表示行。条件board[i]==board[row]可能会检查同一行,但根据我在这里读到的数学。absboard[row]-board[i]==row-我可能会检查对角线。无论如何,我应该添加整个代码board变量可能会为每行存储放置皇后的列。Row是当前行的变量。i是一个循环变量,遍历所有前面的行。例如,如果我们在第2列或第2行中放置皇后,我们需要检查第1行的第2列中是否有皇后,或者第1列或第3列中是否有皇后。在画黑板时更容易理解,因为你总是在同一个方向上迭代,并停在第行,表达式row-i保证是非负的。明白了!谢谢但是那虫子呢?因为它确实有一个bug,当显示GUI时,它说索引超出范围,那么我应该初始化什么呢?超出范围的索引是另一回事。外边界索引意味着您访问[size],但size数组的最后一个元素的索引size-1,所以[size-1]。[0]是一个有效位置,因此列0也是有效的。在您的情况下,我只需使用无效/神奇的值(如-1或Integer.MIN_值)初始化数组元素–这些值永远不会与您的对角线匹配