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;
            };

    喜欢的话,请点赞,转发、收藏、评论,谢谢!
  • 相关阅读:
    送走2015,迎来2016
    Android-Volley网络通信框架(StringRequest &amp; JsonObjectRequest)
    Mac上配置 Ruby on Rails和Git
    学习Javascript闭包(Closure)
    cocos2d-x 学习资源整理(持续更新...)
    android自己定义刷新类控件
    awk条件语句
    Leetcode 236 Lowest Common Ancestor of a Binary Tree
    Linux查看当前正在执行的进程
    Thinking in UML 学习笔记(三)——UML核心视图之类图
  • 原文地址:https://www.cnblogs.com/johnjackson/p/11790524.html
Copyright © 2011-2022 走看看