N皇后问题中遍历二维数组
Traversing the 2D array in the N-Queens problem
我正在尝试使用回溯法解决 N-Queens 问题。 N 皇后问题的 link 可以在这里找到,https://leetcode.com/problems/n-queens/ 请访问那个 link 以更好地理解这个问题。但是,我只想分享一部分我觉得难以理解的代码。请有人向我解释 //check top, //check top - left, // check-top right 是如何工作的。我发现很难理解代码的这个特定部分。
var isValid = function(board, row, col) {
const n = board.length;
// check top
for (let i = 0; i < row; i++) {
if (board[i][col] === 'Q') return false;
}
// check top-left
for (let i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) {
if (board[i][j] === 'Q') return false;
}
// check top-right
for (let i = row - 1, j = col + 1; i >= 0 && j < n; i--, j++) {
if (board[i][j] === 'Q') return false;
}
return true;
}
据我了解,我们需要检查当前位置是否“安全”。所以场上没有皇后能打到位。
为此,我们需要检查垂直、水平和对角线(两者)。
此代码可能只检查当前行之上的行。
top-left 代码块执行以下操作:
想象一下,当前位置是 x=4,y=3。所以要检查 left-top 对角线,我们需要查看位置:
- x=3,y=2
- x=2,y=1
- x=1,y=0
为此,我们最初 select 位置 let i = row - 1, j = col - 1
(从当前位置向左一步和顶部一步)。
然后对于下一步,移动 top-and-left: i--, j--
重复直到达到边界:i >= 0 && j >= 0
top-right 块执行相同的操作,除了我们应该向右移动(增加 X)。
我正在尝试使用回溯法解决 N-Queens 问题。 N 皇后问题的 link 可以在这里找到,https://leetcode.com/problems/n-queens/ 请访问那个 link 以更好地理解这个问题。但是,我只想分享一部分我觉得难以理解的代码。请有人向我解释 //check top, //check top - left, // check-top right 是如何工作的。我发现很难理解代码的这个特定部分。
var isValid = function(board, row, col) {
const n = board.length;
// check top
for (let i = 0; i < row; i++) {
if (board[i][col] === 'Q') return false;
}
// check top-left
for (let i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) {
if (board[i][j] === 'Q') return false;
}
// check top-right
for (let i = row - 1, j = col + 1; i >= 0 && j < n; i--, j++) {
if (board[i][j] === 'Q') return false;
}
return true;
}
据我了解,我们需要检查当前位置是否“安全”。所以场上没有皇后能打到位。 为此,我们需要检查垂直、水平和对角线(两者)。 此代码可能只检查当前行之上的行。
top-left 代码块执行以下操作: 想象一下,当前位置是 x=4,y=3。所以要检查 left-top 对角线,我们需要查看位置:
- x=3,y=2
- x=2,y=1
- x=1,y=0
为此,我们最初 select 位置 let i = row - 1, j = col - 1
(从当前位置向左一步和顶部一步)。
然后对于下一步,移动 top-and-left: i--, j--
重复直到达到边界:i >= 0 && j >= 0
top-right 块执行相同的操作,除了我们应该向右移动(增加 X)。