八皇后问题

本文详细介绍了如何使用JavaScript实现八皇后问题的计算逻辑,通过递归回溯的方法解决棋盘上放置8个皇后而不发生冲突的问题。核心思路是利用一维数组记录路径,检查每一步是否可行,若不可行则回溯到下一列。最终展示了一种有效的解决方案,并输出所有可能的摆放方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(() => { // 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行棋盘
 * 触发递归的条件   当前行当前列可行走
 * 回溯的条件      当前行当前列不可行走,当前列的结果已经计算出来了进行下一列
 */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值