代码随想录算法训练营第十九天 | Javascript | 力扣Leetcode | 回溯 | 51. N皇后

目录

前言

简介

题目链接:51. N皇后


前言

踏平坎坷成大道,斗罢艰险又出发!

自律的尽头是自控,自控的尽头是硬控

愿道友们披荆斩棘,终能得偿所愿。

简介

本人是小几年经验的前端开发,算法基础只有力扣几十道题,非常薄弱。

今天是个人的代码随想录算法硬控自己第19天,继续回溯。

题目链接:51. N皇后
var solveNQueens = function (n) {
    // res存储结果
    // chestBoard初始化: n=3, 此时为[['.', '.', '.'], ['.', '.', '.'], ['.', '.', '.']]
    let res = [], chestBoard = Array.from({ length: n }, () => Array(n).fill('.'));

    const isValid = (chessboard, row, col, n) => {
        // 检查列,i<row而不是i<n是因为row后面的行肯定还没被填充呢,这是个剪枝
        for (let i = 0; i < row; i++) {
            if (chessboard[i][col] == 'Q') {
                return false;
            }
        }
        // 检查 45度角是否有皇后
        for (let i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) {
            if (chessboard[i][j] == 'Q') {
                return false;
            }
        }
        // 检查 135度角是否有皇后
        for (let i = row - 1, j = col + 1; i >= 0 && j < n; i--, j++) {
            if (chessboard[i][j] == 'Q') {
                return false;
            }
        }
        return true;
    };
    const backtracking = function (chestBoard, row, n) {
        // 终止条件,只要成功到了最后一行也就是n-1行,那就是合法结果
        if (row === n) {
            res.push(chestBoard.map((item) => item.join('')));
            return;
        }
        for (let i = 0; i < n; i++) {
            if (isValid(chestBoard, row, i, n)) {
                chestBoard[row][i] = 'Q';
                backtracking(chestBoard, row + 1, n);
                chestBoard[row][i] = '.';
            }
        }
    }
    backtracking(chestBoard, 0, n);
    return res;
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值