LintCode 33 N皇后问题

来源:互联网 发布:淘宝评价手机怎么修改 编辑:程序博客网 时间:2024/05/24 06:36

题目:solveNQueens


要求:

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

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

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

样例:

对于4皇后问题存在两种解决的方案:[    [".Q..", // Solution 1     "...Q",     "Q...",     "..Q."],    ["..Q.", // Solution 2     "Q...",     "...Q",     ".Q.."]]

算法要求:

你能否不使用递归完成?

解题思路:

一行一行的往下弄(相当于放了几个皇后)。将所有当前行可以放置皇后的位置都遍历一次。

算法如下:

    int h[1001] = {0};    int n = 4;    vector<vector<string> > str;    void display() {        vector<string> vec;        for (int i = 0; i < n; i++) {            stringstream in;            for (int j = 0; j < n; j++) {                if (h[i] == j) {                    in << "Q";                } else {                    in << ".";                }            }            string temp = in.str();            vec.push_back(temp);        }        str.push_back(vec);    }    void dist(int row) {        if (row == n) {            display();            return;        }        for (int i = 0; i < n; i++) {            h[row] = i;            bool flag = true;            for (int j = 0; j < row; j++) {                if (h[row] == h[j] || abs(row - j) == abs(h[row] - h[j])) {                    flag = false;                    break;                }            }            if (flag) {                dist(row + 1);            }        }    }    vector<vector<string> > solveNQueens(int n) {        this->n = n;        str.clear();        memset(h, 0, sizeof(h));        dist(0);        return str;    }
0 0
原创粉丝点击