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:

分析: 著名的N皇后问题,可以采用一位数组来代替二维数组,利用回溯,注意皇后行走的条件

class Solution {
public:
    bool isOk(int start,int value, const vector<int>& array){
        for(int i =start-1; i>=0; i--)
            if((array[i]==value) || (abs(array[i]-value)==abs(start-i)))
                return false;
        if(abs(array[start-1]-value)==1)
            return false;
        return true;
    }
    void Queen(int start, vector<int>& array, vector<vector<int>> & res ){
        //cout << start <<endl;
        if(start == array.size()){
            res.push_back(array);
            return;
        }
       for(int i =0; i< array.size(); i++){
           if(isOk(start, i, array)){
              // cout <<"hello"<<endl;
               array[start] =i;
               Queen(start+1, array, res);
           }
           
       }
       return;
    }
    
    void convert(const vector<vector<int>> res, vector<vector<string>>& str){
        for(vector<int> t: res){
            int n = t.size();
            vector<string> strlist;
            for(int i=0; i<n; i++){
                string s(n,'.');
                s[t[i]] = 'Q';
                strlist.push_back(s);
            }
            str.push_back(strlist);
            
        }
        
    }
    vector<vector<string>> solveNQueens(int n) {
        vector<vector<int>> res;
        vector<vector<string>> str;
        if(n==0)
            return str;
        vector<int> array(n,0);
        for(int i =0; i< n; i++){
            array[0] =i;
            Queen(1,array,res);
        }
        convert(res,str);
        return str;
        
    }
};

  

posted @ 2016-12-28 23:04  WillWu  阅读(128)  评论(0编辑  收藏  举报