N皇后问题

参考

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;
    }
};

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 今天做leetcode遇到的。感慨颇多。第一次做这个题,好像是大一,在一本数据结构上看到的,8皇后问题。书的本意是...
    littlersmall阅读 4,741评论 2 50
  • N皇后问题 以八皇后为例,在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,皇后可以在其所在位置的对应的行,列...
    Yihulee阅读 7,104评论 0 2
  • 题目 根据n皇后问题,现在返回n皇后不同的解决方案的数量而不是具体的放置布局。 样例比如n=4,存在2种解决方案 代码
    六尺帐篷阅读 1,300评论 0 1
  • 题目 n皇后问题是将n个皇后放置在n*n的棋盘上,皇后彼此之间不能相互攻击。 给定一个整数n,返回所有不同的n皇后...
    六尺帐篷阅读 4,286评论 0 2
  • What n 皇后问题, 即每一个皇后上下左右,对角线上都不能有其他的皇后存在 解题思路 上下左右,只有当第二个以...
    MangoDai阅读 1,716评论 0 0