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;
    }
    
};
posted @ 2017-05-13 20:23  JeffLai  阅读(188)  评论(0编辑  收藏  举报