题目链接:N 皇后

按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。

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

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

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

方法一:回溯

class Solution {
public:
    vector<vector<string>> ans;
    int m[15][15];
    bool check(int x,int y,int n) {
        for (int i = 0;i < x;i++) {
            if (m[i][y]) return false;
        }
        for (int i = 0;i < y;i++) {
            if (m[x][i]) return false;
        }
        int num = min(x,y);
        // 左上
        for (int i = 1;i <= num;i++) {
            if (m[x-i][y-i]) return false;
        }
        num = min(x,n-y);
        //右上
        for (int i = 1;i <= num;i++) {
            if (m[x-i][y+i]) return false;
        }
        num = min(n-x,n-y);
        
        return true;
    }
    void f(int n,int x) {
        if (x >= n) {
            vector<string> t;
            for (int i = 0;i < n;i++) {
                string s = "";
                for (int j = 0;j < n;j++) {
                    if (m[i][j] == 1) {
                        s += "Q";
                    }else {
                        s += ".";
                    }
                }
                t.push_back(s);
            }
            ans.push_back(t);
            return ;
        }
        for (int i = 0;i < n;i++) {
            if (check(x,i,n)) {
                m[x][i] = 1;
                f(n,x+1);
                m[x][i] = 0;
            }
        }
    }
    vector<vector<string>> solveNQueens(int n) {
        f(n,0);
        return ans;
    }
}; 

标签: hot100, Hard, 回溯

添加新评论