zoukankan      html  css  js  c++  java
  • N皇后问题

            /**
             * @param {number} n
             * @return {string[][]}
             */
            var solveNQueens = function (n) {
                if (n == 1) return [["Q"]];
                let solutions = [];
                let solution = initArrayData(n);//[['', '', '', ''], ['', '', '', ''], ['', '', '', ''], ['', '', '', '']];
                let progress = [];
                let put_count = 0;
                let start_col = 0;
                // let start_row = 0;
                // debugger;
                // 按行数遍历(算法中遇到失败的方案,可能回返回前一行重新尝试,所以循环次数可能大于n)
                for (let row = 0; row < n; row++) {
                    let is_put = false;  //表示当前行是否放入了Q
                    for (let col = start_col; col < n; col++) {
                        if (solution[row][col] == '') {
                            //有空格子,则放一个Q
                            putQueen(row, col);
                            //将当前步骤的方案进度暂存起来,如果后面的步骤失败,则用来返回重试,相当于玩游戏时的存盘和读档
                            progress.push({
                                row: row,
                                col: col,
                                solution: JSON.stringify(solution)
                            });
                            is_put = true;
                            put_count++;
                            break;
                        }
                    }
                    // 如果当前行没有放入Q,则说明到此步的解决方案不正确,需要返回上一行重试(相当于玩游戏读档)
                    if (!is_put) {
                        if (progress.length) {
                            let step = progress.pop();
                            start_col = step.col + 1;
                            row = step.row - 1; //因为循环时每次row自增1,所以为了回到上一行,这里要-1
                            solution = progress.length ? JSON.parse(progress[progress.length - 1].solution) : initArrayData(n);
                            put_count--;
                            continue;
                        } else {
                            //如果当前行一个Q没放,并且没有暂存的进度,则说明此方案失败
                            return solutions;
                        }
                    } else {
                        //当前行放了一个Q,则下一行还是从第一列开始处理
                        start_col = 0;
                    }
                    if (row == n - 1) {
                        if (put_count == n) {
                            let ret = translateSolution(solution);
                            // console.log(ret);
                            solutions.push(ret);
    
                            let step = progress.pop();
                            start_col = step.col + 1;
                            row = step.row - 1;
                            solution = progress.length ? JSON.parse(progress[progress.length - 1].solution) : initArrayData(n);
                            put_count--;
                            continue;
    
                        } else {
                            // console.log('到最后一行,但是Q没有放全');
                            return solutions;
                        }
                    }
                }
    
                function putQueen(x, y) {
                    for (let i = 0; i < n; i++) {
                        solution[x][i] = '.';
                    }
                    for (let i = x+1; i < n; i++) {
                        solution[i][y] = '.';
                    }
                    //向左上方填 .
                    // for (let i = x, j = y; i >= 0 && j >= 0; i-- , j--) {
                    //     solution[i][j] = '.';
                    // }
    
                    ///向右上方填 .
                    // for (let i = x, j = y; i >= 0 && j < n; i-- , j++) {
                    //     solution[i][j] = '.';
                    // }
    
                    // 向右下方填 .
                    for (let i = x, j = y; i < n && j < n; i++ , j++) {
                        solution[i][j] = '.';
                    }
                    //向左下方填 .
                    for (let i = x, j = y; i < n && j >= 0; i++ , j--) {
                        solution[i][j] = '.';
                    }
                    solution[x][y] = 'Q';
                }
    
                function translateSolution(solution) {
                    return solution.map((item) => {
                        return item.join('');
                    });
                }
                function initArrayData(n) {
                    let solution = [];
                    for (let i = 0; i < n; i++) {
                        solution[i] = [];
                        for (let j = 0; j < n; j++) {
                            solution[i][j] = '';
                        }
                    }
                    return solution;
                }
    
                return solutions;
            };

    喜欢的话,请点赞,转发、收藏、评论,谢谢!
  • 相关阅读:
    uva 10369 Arctic Network
    uvalive 5834 Genghis Khan The Conqueror
    uvalive 4848 Tour Belt
    uvalive 4960 Sensor Network
    codeforces 798c Mike And Gcd Problem
    codeforces 796c Bank Hacking
    codeforces 768c Jon Snow And His Favourite Number
    hdu 1114 Piggy-Bank
    poj 1276 Cash Machine
    bzoj 2423 最长公共子序列
  • 原文地址:https://www.cnblogs.com/johnjackson/p/11790524.html
Copyright © 2011-2022 走看看