• N-Queens


    The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens attack each other.

    Given an integer n, return all distinct solutions to the n-queens puzzle.

    Each solution contains a distinct board configuration of the n-queens' placement, where 'Q' and '.' both indicate a queen and an empty space respectively.

    For example,
    There exist two distinct solutions to the 4-queens puzzle:

    [
     [".Q..",  // Solution 1
      "...Q",
      "Q...",
      "..Q."],
    
     ["..Q.",  // Solution 2
      "Q...",
      "...Q",
      ".Q.."]
    ]
    

    Subscribe to see which companies asked this question

    主要参考 http://blog.csdn.net/hackbuteer1/article/details/6657109

    class Solution {
    public:
        vector<vector<string>> solveNQueens(int n) {
            int i;
            //初始化
            for (i=0; i<n*n; i++) {
                _queue_arr[i] = INIT_VAL;
            }
            vector<vector<string>> res;
            int row = 0;
            int col = 0;
            //遍历每一行
            while (row < n) {
                //遍历每一列
                while (col < n) {
                    //如果冲突,就计算下一列
                    if (is_conflict(row, col, n)) {
                        col++;
                    } else {
                        _queue_arr[row] = col;
                        col = 0;
                        break;
                    }
                }
                //遍历完每一列后,检查是否成功放置皇后
                //如果失败
                if (col == n) {
                    //如果当前行是第0行了,就说明所有的jie都被求出了
                    if (0 == row) {
                        break;
                    } else {
                        //如果不是,就从上一行的下一列开始放置皇后,并进行判断
                        row--;
                        col = _queue_arr[row];
                        col++;
                        _queue_arr[row] = INIT_VAL;
                        continue;
                    }
                    //如果当前行是最后一行了,就输出
                } else if (row == n - 1) {
                    handle_result(res, n);
                    col = _queue_arr[row] + 1;
                    _queue_arr[row] = INIT_VAL;
                    continue;
                    //不是最后一行,就计算下一行
                } else {
                    row++;
                };
            }
            return res;
        }
    
    private:
        /*
         * 判断是否冲突,主要检测方式是 ,如果冲突
         * queue_arr[i] == queue_arr[j]
         * |queue_arr[i] -  queue_arr[j]| = |i - j|
         *
         * @param row: 当前行
         * @param col: 当前列
         * @param n: 所有的行数和列数
         */
        bool is_conflict(int row, int col, int n) const{
            int i;
            for (i=0; i<n; i++) {
                if (_queue_arr[i] == col || abs(_queue_arr[i] - col) == abs(i - row)) {
                    return true;
                }
            }
            return false;
        }
    
        /*
         * 处理结果
         * @param res_str 结果集合
         * @param n  行数
         */
        void handle_result(vector<vector<string>> &res_str, int n) {
            vector<string> slu_str;
            int i,j;
            for (i=0; i<n; i++) {
                string tmp = "";
                for (j=0; j<n; j++) {
                    if (_queue_arr[i] == j) {
                        tmp += "Q";
                    } else {
                        tmp += ".";
                    }
                }
                slu_str.push_back(tmp);
            }
            res_str.push_back(slu_str);
        }
    
    
    
    private:
        int _queue_arr[1000];
        const static int INIT_VAL = -10000;
    
    };
  • 相关阅读:
    Dash panel 里面添加启动项
    Ubuntu安装chrome
    多核CPU服务器 tomcat配置
    Iptux 信使 自动缩小问题 ubuntu12.04
    Html5 上传文件
    ubuntu 12.04 字体设置
    Ubuntu12.04 Eclipse 背景颜色 修改
    一些需要禁用的PHP危险函数
    Oracle 修改带数据的字段类型
    oracle 中同一个字段1 ,字段追加,字段部分数据删除
  • 原文地址:https://www.cnblogs.com/SpeakSoftlyLove/p/5100650.html
Copyright © 2020-2023  润新知