N皇后问题

2016-09-19  本文已影响9人  杰米

参考

n皇后问题是将n个皇后放置在n*n的棋盘上,皇后彼此之间不能相互攻击。

给定一个整数n,返回所有不同的n皇后问题的解决方案。

每个解决方案包含一个明确的n皇后放置布局,其中“Q”和“.”分别表示一个女王和一个空位置。

您在真实的面试中是否遇到过这个题? Yes
样例
对于4皇后问题存在两种解决的方案:

[

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

     "...Q",

     "Q...",

     "..Q."],

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

     "Q...",

     "...Q",

     ".Q.."]

]
class Solution {
public:
    /**
     * Get all distinct N-Queen solutions
     * @param n: The number of queens
     * @return: All distinct solutions
     * For example, A string '...Q' shows a queen on forth position
     */
    #define INITIAL -1000
    
    bool isValid(vector<int> &table,int row,int col,int n) {
       for(int i = 0;i < n;i++) {
           if (table[i] == col || abs(i-row) == abs(table[i]-col)) {
               return false;
           }
       }
       return true;
    }
    
    vector<string> getOneResult(vector<int> &table,int n) {
        string a(n,'.');
        vector<string> result(n,a);
       for(int i = 0;i < n;i++) {
            string temp = result[i];
            temp[table[i]] = 'Q';
            result[i] = temp;
       }
        return result;
    }
    
    vector<vector<string> > solveNQueens(int n) {
        // write your code here
        vector<vector<string> > results;
        vector<int> table(n,INITIAL);
        int i = 0;
        int j = 0;
        while(i < n) {
            
            while(j < n) {
                if (isValid(table,i,j,n) == true) {
                    table[i] = j;
                    j = 0;
                    break;
                } else {
                    ++j;
                }
            } //这个j循环找到适合的放置地点,若找不到table[i] == INITIAL
            
            if (table[i] == INITIAL) {
                if(i == 0) {
                    break;//回溯到第一行没解就终止
                } else {
                    i--;//回溯上一行的下一列
                    j = table[i] + 1;
                    table[i] = INITIAL;
                    continue;
                }
            }
            
            if (i == n-1) { //最后一行打印
                results.push_back(getOneResult(table,n));
                j = table[i] + 1;
                 table[i] = INITIAL;
                 continue;
            }
            
            i++;
        }
        return results;
    }
};

上一篇下一篇

猜你喜欢

热点阅读