zoukankan      html  css  js  c++  java
  • Leetcode:51. N-Queens

    Description

    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.

    Example

    For example,
    There exist two distinct solutions to the 4-queens puzzle:
    
    [
        [".Q..",  // Solution 1
        "...Q",
         "Q...",
         "..Q."],
    
        ["..Q.",  // Solution 2
         "Q...",
         "...Q",
         ".Q.."]
    ]
    

    思路

    • 按照剑指offer上比较low的思路,先将所有的排列求出来,然后判断每个排列是否满足条件
    • 递归方式

    代码

    • 求出所有排列后判断
    class Solution {
    public:
        vector<vector<string>> solveNQueens(int n) {
            vector<vector<string>> res;
            if(n == 0) return res;
            
            vector<int> nums(n);
            for(int i = 0; i < n; ++i)
                nums[i] = i;
                
            do{
                if(isValid(nums, n)){
                    vector<string> str;
                     generate(nums, n, str);
                     res.push_back(str);
                }
            }while(getNextPermutation(nums, n));
            
            return res;
        }
    
    private:
        bool getNextPermutation(vector<int> &nums, int len){
            int index1 = 0, index2 = -1, flag = -1;
            for(int i = 1; i < len; ++i){
                if(nums[i] > nums[i - 1]){
                    index1 = i - 1;
                    index2 = i;
                    flag = nums[i] - nums[i - 1];
                }
                else if(nums[i] > nums[index1] && nums[i] - nums[index1] < flag){
                    index2 = i;
                    flag = nums[i] - nums[index1];
                }
            }
            
            if(index2 == -1) return false;
            swap(nums[index1], nums[index2]);
            sort(nums.begin() + index1 + 1, nums.end());
            return true;
        }
        
        bool isValid(vector<int> &nums, int len){
            for(int i = 0; i < len; ++i){
                for(int j = i + 1; j < len; ++j){
                    if(i - j == nums[i] - nums[j] || j - i == nums[i] - nums[j])
                        return false;
                }
            }
            
            return true;
        }
        
        void generate(vector<int>& nums, int len, vector<string> &str){
            for(int i = 0; i < len; ++i){
                string tmp(len, '.');
                tmp[nums[i]] = 'Q';
                str.push_back(tmp);
            } 
        }
    };
    
    class Solution {
    public:
        vector<vector<string>> solveNQueens(int n) {
            vector<vector<string>> res;
            if(n == 0) return res;
            
            vector<string> nums(n, string(n, '.'));
            
            solve(res, nums, n, 0);
            
            return res;
        }
    
    private:
        void solve(vector<vector<string>> &res, vector<string> &nums, int n, int rows){
           if(rows == n){
               res.push_back(nums);
               return;
           }
           
           for(int cols = 0; cols < n; ++cols){
               if(isValid(nums, rows, cols, n)){
                   nums[rows][cols] = 'Q';
                   solve(res, nums, n, rows + 1);
                   nums[rows][cols] = '.';
               }
           }
        }
        
        bool isValid(vector<string> &nums, int rows, int cols, int n){
            for(int i = 0; i != rows; ++i){
               if(nums[i][cols] == 'Q')
                    return false;
            }
            
            for(int i = rows- 1, j = cols - 1; i >= 0 && j >= 0; --i, --j)
                if(nums[i][j] == 'Q')
                    return false;
                    
            for(int i = rows - 1, j = cols + 1; i >= 0 && j < n; --i, ++j)
                if(nums[i][j] == 'Q')
                    return false;
            
            return true;
        }
        
    };
    
  • 相关阅读:
    创建github怎样管理
    端口号的作用
    正则
    分布式代码管理github
    实现MVC
    AngularJS核心特性(四大点)
    什么是跨域,什么是同源
    rem怎么计算
    正则须知(以后还会添加)
    LA 6448 Credit Card Payment
  • 原文地址:https://www.cnblogs.com/lengender-12/p/6850243.html
Copyright © 2011-2022 走看看