leetcode51. N皇后

题目如下:

皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

上图为 8 皇后问题的一种解法。

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

每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。

示例:

输入: 4
输出: [
 [".Q..",  // 解法 1
  "...Q",
  "Q...",
  "..Q."],

 ["..Q.",  // 解法 2
  "Q...",
  "...Q",
  ".Q.."]
]
解释: 4 皇后问题存在两个不同的解法。

这题主要就是要输出恶心了一点,我们可以到最后才处理输出,也就是说,我们可以先记录位置信息,最后再把位置信息转化成字符串表示出来就好。

具体做法就是:在遍历过程中记录用一个vector记录每一次状态的列的状态,就是说这一次符合要求的状态第一行放在第几列,第二行放在第几列。。。第n行放在第几列。所以这一个vector只需要记载n个数。然后如果有m种符合要求的状态,那么就在外面在套一层vector,记录这M个可能的状态。

这样所有状态都被记录在内,并且要变成字符串就在最后处理一下即可。详见代码:

class Solution {
public:
    vector< vector<int> >v;
    
    void dfs(vector<int> ve,int n){ #遍历,找所有的状态,记录每一种状态的位置信息
        int sz = ve.size();
        if(sz==n){
            v.push_back(ve);
            return;
        }
        if(sz==0){
            for(int i=0;i<n;i++){
                ve.push_back(i);
                dfs(ve,n);
                ve.pop_back();
            }
            return ;
        }
        for(int i=0;i<n;i++){
            bool flag = 0;
            for(int j=0;j<sz;j++){
                int tmp = ve[j];
                if(tmp==i||abs(sz-j)==abs(i-tmp)){
                    flag = 1;
                }
            }
            if(!flag){
                ve.push_back(i);
                    int ssz = ve.size();
                    if(ssz==n){
                        v.push_back(ve);
                        return ;
                    }
                    dfs(ve,n);
                    ve.pop_back();
            }
        }
    }

    vector<vector<string> > solveNQueens(int n) {
    vector<int>ii;
    dfs(ii,n);
    int ssz = v.size();#把位置变成字符串
    vector<vector<string> >vv;
    vector<string>vs;
    string s="";
    for(int i=0;i<n;i++)s+="."; #最后第几个是Q就把那个字符替换成Q即可
    for(int i=0;i<ssz;i++){
        for(int j=0;j<n;j++){
            int tmp = v[i][j];
            s[tmp] = 'Q';
            vs.push_back(s);
            s[tmp] = '.';
        }
        vv.push_back(vs);
        vs.clear();
    }
    return vv;
    }

};

以上

猜你喜欢

转载自blog.csdn.net/lwgkzl/article/details/81190960