(() => { // 8皇后的计算逻辑
// 之前想的是将棋盘用一个二维数组装入
// 然后又一个缓存了路径的数组 记录走过的路径
// 每个格子进行对比
// 没想过什么情况下一遍将棋盘走完,没想过for循环完成每一列的递归回溯 单行每列的判定
// 没想过用一个一维数组来记录走过的路径
var result = [];
var max = 8;
var count = 0;
function queueMain() {
check(0);
console.log(`共计 ${count} 种走法`);
}
/** @param n 第n行 */
function check(n) {
if (n == max) { // 8行数据已经获得了一个解
printResult();
return;
}
for (let index = 0; index < max; index++) { // 循环棋盘当前行的每一列
result[n] = index; // 将当前走到的格子记录到result中 n表示行,index表示列
if (judgePass(n)) { // 能够通过就开始下一行
check(n + 1);
} else {
// 否则进入下一个循环即当前行的下一列
}
}
}
/** @param n 行 判定是否能够行走到当前棋盘的格子 */
function judgePass(n) {
for (let index = 0; index < n; index++) { // 将前面的n行元素进行比较
if (
result[index] == result[n] || // 列相同
Math.abs(index - n) == Math.abs(result[index] - result[n]) // 判定斜面是否在同一直线
) {
return false;
}
}
return true; // 可以通过
}
function printResult() {
count ++;
console.log(result);
}
queueMain();
})();
/**
* 结束递归的条件 找完了8行棋盘
* 触发递归的条件 当前行当前列可行走
* 回溯的条件 当前行当前列不可行走,当前列的结果已经计算出来了进行下一列
*/
八皇后问题
最新推荐文章于 2023-07-07 14:04:01 发布