回溯法求解N皇后问题

问题描述:

在n*n格的棋盘上放置彼此不受攻击的n个皇后(按照国际象棋的规则),即任意两个皇后不能处在同一行或同一列或同一斜线上。

实现:

/* *回溯法,N皇后问题 *author: booirror@163.com */
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;

struct Point{
    Point(int _x, int _y): x(_x), y(_y) {}
    int x;
    int y;
};

class QueenProblem {
public:
    QueenProblem(int _n) :n(_n){}
    ~QueenProblem() {}
    bool check(vector<Point>& vp, Point &p);
    void solve();
    void print();
private:
    int n;
    vector<vector<Point> > vvp;
};

bool QueenProblem::check(vector<Point>& vp, Point& p)
{
    for (int i = 0; i < vp.size(); ++i) {
        if (vp[i].x == p.x || vp[i].y == p.y || abs(vp[i].y - p.y) == abs(vp[i].x - p.x))
            return false;
    }
    return true;
}

void QueenProblem::solve()
{
    vector<Point> vp;
    int x = 0;
    int y = 0;
    while (x >= 0) {
        Point point(x, y);
        while (point.y < n && !check(vp, point)) {
            point.y++;
        }
        if (point.y < n) {
            vp.push_back(point);
            if (x == n - 1) {
                vvp.push_back(vp);
                vp.pop_back();
                y = point.y + 1;
            } else {
                x++;
                y = 0;
            }
        } else {
            x = x - 1;
            if (vp.size() > 0) {
                y = vp.back().y + 1;
                vp.pop_back();
            }
        }
    }
}

void QueenProblem::print()
{
    for (int i = 0; i < vvp.size(); ++i) {
        cout << "-----------[solution " << i + 1 << "]----------" <<endl;
        for (int j = 0; j < vvp[i].size(); ++j) {
            for (int k = 0; k < n; ++k) {
                if (vvp[i][j].y == k) {
                    cout << "Q ";
                } else {
                    cout << "* ";
                }
            }
            cout << endl;
        }
    }
}

void nQueen(int n)
{
    QueenProblem problem(n);
    problem.solve();
    problem.print();
}

int main()
{
    nQueen(8);
    return 0;
}

八皇后的求解结果:

-----------[solution 1]----------
Q * * * * * * * 
* * * * Q * * * 
* * * * * * * Q 
* * * * * Q * * 
* * Q * * * * * 
* * * * * * Q * 
* Q * * * * * * 
* * * Q * * * * 
-----------[solution 2]----------
Q * * * * * * * 
* * * * * Q * * 
* * * * * * * Q 
* * Q * * * * * 
* * * * * * Q * 
* * * Q * * * * 
* Q * * * * * * 
* * * * Q * * * 
-----------[solution 3]----------
Q * * * * * * * 
* * * * * * Q * 
* * * Q * * * * 
* * * * * Q * * 
* * * * * * * Q 
* Q * * * * * * 
* * * * Q * * * 
* * Q * * * * * 
-----------[solution 4]----------
Q * * * * * * * 
* * * * * * Q * 
* * * * Q * * * 
* * * * * * * Q 
* Q * * * * * * 
* * * Q * * * * 
* * * * * Q * * 
* * Q * * * * * 
-----------[solution 5]----------
* Q * * * * * * 
* * * Q * * * * 
* * * * * Q * * 
* * * * * * * Q 
* * Q * * * * * 
Q * * * * * * * 
* * * * * * Q * 
* * * * Q * * * 
-----------[solution 6]----------
* Q * * * * * * 
* * * * Q * * * 
* * * * * * Q * 
Q * * * * * * * 
* * Q * * * * * 
* * * * * * * Q 
* * * * * Q * * 
* * * Q * * * * 
-----------[solution 7]----------
* Q * * * * * * 
* * * * Q * * * 
* * * * * * Q * 
* * * Q * * * * 
Q * * * * * * * 
* * * * * * * Q 
* * * * * Q * * 
* * Q * * * * * 
-----------[solution 8]----------
* Q * * * * * * 
* * * * * Q * * 
Q * * * * * * * 
* * * * * * Q * 
* * * Q * * * * 
* * * * * * * Q 
* * Q * * * * * 
* * * * Q * * * 
-----------[solution 9]----------
* Q * * * * * * 
* * * * * Q * * 
* * * * * * * Q 
* * Q * * * * * 
Q * * * * * * * 
* * * Q * * * * 
* * * * * * Q * 
* * * * Q * * * 
-----------[solution 10]----------
* Q * * * * * * 
* * * * * * Q * 
* * Q * * * * * 
* * * * * Q * * 
* * * * * * * Q 
* * * * Q * * * 
Q * * * * * * * 
* * * Q * * * * 
-----------[solution 11]----------
* Q * * * * * * 
* * * * * * Q * 
* * * * Q * * * 
* * * * * * * Q 
Q * * * * * * * 
* * * Q * * * * 
* * * * * Q * * 
* * Q * * * * * 
-----------[solution 12]----------
* Q * * * * * * 
* * * * * * * Q 
* * * * * Q * * 
Q * * * * * * * 
* * Q * * * * * 
* * * * Q * * * 
* * * * * * Q * 
* * * Q * * * * 
-----------[solution 13]----------
* * Q * * * * * 
Q * * * * * * * 
* * * * * * Q * 
* * * * Q * * * 
* * * * * * * Q 
* Q * * * * * * 
* * * Q * * * * 
* * * * * Q * * 
-----------[solution 14]----------
* * Q * * * * * 
* * * * Q * * * 
* Q * * * * * * 
* * * * * * * Q 
Q * * * * * * * 
* * * * * * Q * 
* * * Q * * * * 
* * * * * Q * * 
-----------[solution 15]----------
* * Q * * * * * 
* * * * Q * * * 
* Q * * * * * * 
* * * * * * * Q 
* * * * * Q * * 
* * * Q * * * * 
* * * * * * Q * 
Q * * * * * * * 
-----------[solution 16]----------
* * Q * * * * * 
* * * * Q * * * 
* * * * * * Q * 
Q * * * * * * * 
* * * Q * * * * 
* Q * * * * * * 
* * * * * * * Q 
* * * * * Q * * 
-----------[solution 17]----------
* * Q * * * * * 
* * * * Q * * * 
* * * * * * * Q 
* * * Q * * * * 
Q * * * * * * * 
* * * * * * Q * 
* Q * * * * * * 
* * * * * Q * * 
-----------[solution 18]----------
* * Q * * * * * 
* * * * * Q * * 
* Q * * * * * * 
* * * * Q * * * 
* * * * * * * Q 
Q * * * * * * * 
* * * * * * Q * 
* * * Q * * * * 
-----------[solution 19]----------
* * Q * * * * * 
* * * * * Q * * 
* Q * * * * * * 
* * * * * * Q * 
Q * * * * * * * 
* * * Q * * * * 
* * * * * * * Q 
* * * * Q * * * 
-----------[solution 20]----------
* * Q * * * * * 
* * * * * Q * * 
* Q * * * * * * 
* * * * * * Q * 
* * * * Q * * * 
Q * * * * * * * 
* * * * * * * Q 
* * * Q * * * * 
-----------[solution 21]----------
* * Q * * * * * 
* * * * * Q * * 
* * * Q * * * * 
Q * * * * * * * 
* * * * * * * Q 
* * * * Q * * * 
* * * * * * Q * 
* Q * * * * * * 
-----------[solution 22]----------
* * Q * * * * * 
* * * * * Q * * 
* * * Q * * * * 
* Q * * * * * * 
* * * * * * * Q 
* * * * Q * * * 
* * * * * * Q * 
Q * * * * * * * 
-----------[solution 23]----------
* * Q * * * * * 
* * * * * Q * * 
* * * * * * * Q 
Q * * * * * * * 
* * * Q * * * * 
* * * * * * Q * 
* * * * Q * * * 
* Q * * * * * * 
-----------[solution 24]----------
* * Q * * * * * 
* * * * * Q * * 
* * * * * * * Q 
Q * * * * * * * 
* * * * Q * * * 
* * * * * * Q * 
* Q * * * * * * 
* * * Q * * * * 
-----------[solution 25]----------
* * Q * * * * * 
* * * * * Q * * 
* * * * * * * Q 
* Q * * * * * * 
* * * Q * * * * 
Q * * * * * * * 
* * * * * * Q * 
* * * * Q * * * 
-----------[solution 26]----------
* * Q * * * * * 
* * * * * * Q * 
* Q * * * * * * 
* * * * * * * Q 
* * * * Q * * * 
Q * * * * * * * 
* * * Q * * * * 
* * * * * Q * * 
-----------[solution 27]----------
* * Q * * * * * 
* * * * * * Q * 
* Q * * * * * * 
* * * * * * * Q 
* * * * * Q * * 
* * * Q * * * * 
Q * * * * * * * 
* * * * Q * * * 
-----------[solution 28]----------
* * Q * * * * * 
* * * * * * * Q 
* * * Q * * * * 
* * * * * * Q * 
Q * * * * * * * 
* * * * * Q * * 
* Q * * * * * * 
* * * * Q * * * 
-----------[solution 29]----------
* * * Q * * * * 
Q * * * * * * * 
* * * * Q * * * 
* * * * * * * Q 
* Q * * * * * * 
* * * * * * Q * 
* * Q * * * * * 
* * * * * Q * * 
-----------[solution 30]----------
* * * Q * * * * 
Q * * * * * * * 
* * * * Q * * * 
* * * * * * * Q 
* * * * * Q * * 
* * Q * * * * * 
* * * * * * Q * 
* Q * * * * * * 
-----------[solution 31]----------
* * * Q * * * * 
* Q * * * * * * 
* * * * Q * * * 
* * * * * * * Q 
* * * * * Q * * 
Q * * * * * * * 
* * Q * * * * * 
* * * * * * Q * 
-----------[solution 32]----------
* * * Q * * * * 
* Q * * * * * * 
* * * * * * Q * 
* * Q * * * * * 
* * * * * Q * * 
* * * * * * * Q 
Q * * * * * * * 
* * * * Q * * * 
-----------[solution 33]----------
* * * Q * * * * 
* Q * * * * * * 
* * * * * * Q * 
* * Q * * * * * 
* * * * * Q * * 
* * * * * * * Q 
* * * * Q * * * 
Q * * * * * * * 
-----------[solution 34]----------
* * * Q * * * * 
* Q * * * * * * 
* * * * * * Q * 
* * * * Q * * * 
Q * * * * * * * 
* * * * * * * Q 
* * * * * Q * * 
* * Q * * * * * 
-----------[solution 35]----------
* * * Q * * * * 
* Q * * * * * * 
* * * * * * * Q 
* * * * Q * * * 
* * * * * * Q * 
Q * * * * * * * 
* * Q * * * * * 
* * * * * Q * * 
-----------[solution 36]----------
* * * Q * * * * 
* Q * * * * * * 
* * * * * * * Q 
* * * * * Q * * 
Q * * * * * * * 
* * Q * * * * * 
* * * * Q * * * 
* * * * * * Q * 
-----------[solution 37]----------
* * * Q * * * * 
* * * * * Q * * 
Q * * * * * * * 
* * * * Q * * * 
* Q * * * * * * 
* * * * * * * Q 
* * Q * * * * * 
* * * * * * Q * 
-----------[solution 38]----------
* * * Q * * * * 
* * * * * Q * * 
* * * * * * * Q 
* Q * * * * * * 
* * * * * * Q * 
Q * * * * * * * 
* * Q * * * * * 
* * * * Q * * * 
-----------[solution 39]----------
* * * Q * * * * 
* * * * * Q * * 
* * * * * * * Q 
* * Q * * * * * 
Q * * * * * * * 
* * * * * * Q * 
* * * * Q * * * 
* Q * * * * * * 
-----------[solution 40]----------
* * * Q * * * * 
* * * * * * Q * 
Q * * * * * * * 
* * * * * * * Q 
* * * * Q * * * 
* Q * * * * * * 
* * * * * Q * * 
* * Q * * * * * 
-----------[solution 41]----------
* * * Q * * * * 
* * * * * * Q * 
* * Q * * * * * 
* * * * * * * Q 
* Q * * * * * * 
* * * * Q * * * 
Q * * * * * * * 
* * * * * Q * * 
-----------[solution 42]----------
* * * Q * * * * 
* * * * * * Q * 
* * * * Q * * * 
* Q * * * * * * 
* * * * * Q * * 
Q * * * * * * * 
* * Q * * * * * 
* * * * * * * Q 
-----------[solution 43]----------
* * * Q * * * * 
* * * * * * Q * 
* * * * Q * * * 
* * Q * * * * * 
Q * * * * * * * 
* * * * * Q * * 
* * * * * * * Q 
* Q * * * * * * 
-----------[solution 44]----------
* * * Q * * * * 
* * * * * * * Q 
Q * * * * * * * 
* * Q * * * * * 
* * * * * Q * * 
* Q * * * * * * 
* * * * * * Q * 
* * * * Q * * * 
-----------[solution 45]----------
* * * Q * * * * 
* * * * * * * Q 
Q * * * * * * * 
* * * * Q * * * 
* * * * * * Q * 
* Q * * * * * * 
* * * * * Q * * 
* * Q * * * * * 
-----------[solution 46]----------
* * * Q * * * * 
* * * * * * * Q 
* * * * Q * * * 
* * Q * * * * * 
Q * * * * * * * 
* * * * * * Q * 
* Q * * * * * * 
* * * * * Q * * 
-----------[solution 47]----------
* * * * Q * * * 
Q * * * * * * * 
* * * Q * * * * 
* * * * * Q * * 
* * * * * * * Q 
* Q * * * * * * 
* * * * * * Q * 
* * Q * * * * * 
-----------[solution 48]----------
* * * * Q * * * 
Q * * * * * * * 
* * * * * * * Q 
* * * Q * * * * 
* Q * * * * * * 
* * * * * * Q * 
* * Q * * * * * 
* * * * * Q * * 
-----------[solution 49]----------
* * * * Q * * * 
Q * * * * * * * 
* * * * * * * Q 
* * * * * Q * * 
* * Q * * * * * 
* * * * * * Q * 
* Q * * * * * * 
* * * Q * * * * 
-----------[solution 50]----------
* * * * Q * * * 
* Q * * * * * * 
* * * Q * * * * 
* * * * * Q * * 
* * * * * * * Q 
* * Q * * * * * 
Q * * * * * * * 
* * * * * * Q * 
-----------[solution 51]----------
* * * * Q * * * 
* Q * * * * * * 
* * * Q * * * * 
* * * * * * Q * 
* * Q * * * * * 
* * * * * * * Q 
* * * * * Q * * 
Q * * * * * * * 
-----------[solution 52]----------
* * * * Q * * * 
* Q * * * * * * 
* * * * * Q * * 
Q * * * * * * * 
* * * * * * Q * 
* * * Q * * * * 
* * * * * * * Q 
* * Q * * * * * 
-----------[solution 53]----------
* * * * Q * * * 
* Q * * * * * * 
* * * * * * * Q 
Q * * * * * * * 
* * * Q * * * * 
* * * * * * Q * 
* * Q * * * * * 
* * * * * Q * * 
-----------[solution 54]----------
* * * * Q * * * 
* * Q * * * * * 
Q * * * * * * * 
* * * * * Q * * 
* * * * * * * Q 
* Q * * * * * * 
* * * Q * * * * 
* * * * * * Q * 
-----------[solution 55]----------
* * * * Q * * * 
* * Q * * * * * 
Q * * * * * * * 
* * * * * * Q * 
* Q * * * * * * 
* * * * * * * Q 
* * * * * Q * * 
* * * Q * * * * 
-----------[solution 56]----------
* * * * Q * * * 
* * Q * * * * * 
* * * * * * * Q 
* * * Q * * * * 
* * * * * * Q * 
Q * * * * * * * 
* * * * * Q * * 
* Q * * * * * * 
-----------[solution 57]----------
* * * * Q * * * 
* * * * * * Q * 
Q * * * * * * * 
* * Q * * * * * 
* * * * * * * Q 
* * * * * Q * * 
* * * Q * * * * 
* Q * * * * * * 
-----------[solution 58]----------
* * * * Q * * * 
* * * * * * Q * 
Q * * * * * * * 
* * * Q * * * * 
* Q * * * * * * 
* * * * * * * Q 
* * * * * Q * * 
* * Q * * * * * 
-----------[solution 59]----------
* * * * Q * * * 
* * * * * * Q * 
* Q * * * * * * 
* * * Q * * * * 
* * * * * * * Q 
Q * * * * * * * 
* * Q * * * * * 
* * * * * Q * * 
-----------[solution 60]----------
* * * * Q * * * 
* * * * * * Q * 
* Q * * * * * * 
* * * * * Q * * 
* * Q * * * * * 
Q * * * * * * * 
* * * Q * * * * 
* * * * * * * Q 
-----------[solution 61]----------
* * * * Q * * * 
* * * * * * Q * 
* Q * * * * * * 
* * * * * Q * * 
* * Q * * * * * 
Q * * * * * * * 
* * * * * * * Q 
* * * Q * * * * 
-----------[solution 62]----------
* * * * Q * * * 
* * * * * * Q * 
* * * Q * * * * 
Q * * * * * * * 
* * Q * * * * * 
* * * * * * * Q 
* * * * * Q * * 
* Q * * * * * * 
-----------[solution 63]----------
* * * * Q * * * 
* * * * * * * Q 
* * * Q * * * * 
Q * * * * * * * 
* * Q * * * * * 
* * * * * Q * * 
* Q * * * * * * 
* * * * * * Q * 
-----------[solution 64]----------
* * * * Q * * * 
* * * * * * * Q 
* * * Q * * * * 
Q * * * * * * * 
* * * * * * Q * 
* Q * * * * * * 
* * * * * Q * * 
* * Q * * * * * 
-----------[solution 65]----------
* * * * * Q * * 
Q * * * * * * * 
* * * * Q * * * 
* Q * * * * * * 
* * * * * * * Q 
* * Q * * * * * 
* * * * * * Q * 
* * * Q * * * * 
-----------[solution 66]----------
* * * * * Q * * 
* Q * * * * * * 
* * * * * * Q * 
Q * * * * * * * 
* * Q * * * * * 
* * * * Q * * * 
* * * * * * * Q 
* * * Q * * * * 
-----------[solution 67]----------
* * * * * Q * * 
* Q * * * * * * 
* * * * * * Q * 
Q * * * * * * * 
* * * Q * * * * 
* * * * * * * Q 
* * * * Q * * * 
* * Q * * * * * 
-----------[solution 68]----------
* * * * * Q * * 
* * Q * * * * * 
Q * * * * * * * 
* * * * * * Q * 
* * * * Q * * * 
* * * * * * * Q 
* Q * * * * * * 
* * * Q * * * * 
-----------[solution 69]----------
* * * * * Q * * 
* * Q * * * * * 
Q * * * * * * * 
* * * * * * * Q 
* * * Q * * * * 
* Q * * * * * * 
* * * * * * Q * 
* * * * Q * * * 
-----------[solution 70]----------
* * * * * Q * * 
* * Q * * * * * 
Q * * * * * * * 
* * * * * * * Q 
* * * * Q * * * 
* Q * * * * * * 
* * * Q * * * * 
* * * * * * Q * 
-----------[solution 71]----------
* * * * * Q * * 
* * Q * * * * * 
* * * * Q * * * 
* * * * * * Q * 
Q * * * * * * * 
* * * Q * * * * 
* Q * * * * * * 
* * * * * * * Q 
-----------[solution 72]----------
* * * * * Q * * 
* * Q * * * * * 
* * * * Q * * * 
* * * * * * * Q 
Q * * * * * * * 
* * * Q * * * * 
* Q * * * * * * 
* * * * * * Q * 
-----------[solution 73]----------
* * * * * Q * * 
* * Q * * * * * 
* * * * * * Q * 
* Q * * * * * * 
* * * Q * * * * 
* * * * * * * Q 
Q * * * * * * * 
* * * * Q * * * 
-----------[solution 74]----------
* * * * * Q * * 
* * Q * * * * * 
* * * * * * Q * 
* Q * * * * * * 
* * * * * * * Q 
* * * * Q * * * 
Q * * * * * * * 
* * * Q * * * * 
-----------[solution 75]----------
* * * * * Q * * 
* * Q * * * * * 
* * * * * * Q * 
* * * Q * * * * 
Q * * * * * * * 
* * * * * * * Q 
* Q * * * * * * 
* * * * Q * * * 
-----------[solution 76]----------
* * * * * Q * * 
* * * Q * * * * 
Q * * * * * * * 
* * * * Q * * * 
* * * * * * * Q 
* Q * * * * * * 
* * * * * * Q * 
* * Q * * * * * 
-----------[solution 77]----------
* * * * * Q * * 
* * * Q * * * * 
* Q * * * * * * 
* * * * * * * Q 
* * * * Q * * * 
* * * * * * Q * 
Q * * * * * * * 
* * Q * * * * * 
-----------[solution 78]----------
* * * * * Q * * 
* * * Q * * * * 
* * * * * * Q * 
Q * * * * * * * 
* * Q * * * * * 
* * * * Q * * * 
* Q * * * * * * 
* * * * * * * Q 
-----------[solution 79]----------
* * * * * Q * * 
* * * Q * * * * 
* * * * * * Q * 
Q * * * * * * * 
* * * * * * * Q 
* Q * * * * * * 
* * * * Q * * * 
* * Q * * * * * 
-----------[solution 80]----------
* * * * * Q * * 
* * * * * * * Q 
* Q * * * * * * 
* * * Q * * * * 
Q * * * * * * * 
* * * * * * Q * 
* * * * Q * * * 
* * Q * * * * * 
-----------[solution 81]----------
* * * * * * Q * 
Q * * * * * * * 
* * Q * * * * * 
* * * * * * * Q 
* * * * * Q * * 
* * * Q * * * * 
* Q * * * * * * 
* * * * Q * * * 
-----------[solution 82]----------
* * * * * * Q * 
* Q * * * * * * 
* * * Q * * * * 
Q * * * * * * * 
* * * * * * * Q 
* * * * Q * * * 
* * Q * * * * * 
* * * * * Q * * 
-----------[solution 83]----------
* * * * * * Q * 
* Q * * * * * * 
* * * * * Q * * 
* * Q * * * * * 
Q * * * * * * * 
* * * Q * * * * 
* * * * * * * Q 
* * * * Q * * * 
-----------[solution 84]----------
* * * * * * Q * 
* * Q * * * * * 
Q * * * * * * * 
* * * * * Q * * 
* * * * * * * Q 
* * * * Q * * * 
* Q * * * * * * 
* * * Q * * * * 
-----------[solution 85]----------
* * * * * * Q * 
* * Q * * * * * 
* * * * * * * Q 
* Q * * * * * * 
* * * * Q * * * 
Q * * * * * * * 
* * * * * Q * * 
* * * Q * * * * 
-----------[solution 86]----------
* * * * * * Q * 
* * * Q * * * * 
* Q * * * * * * 
* * * * Q * * * 
* * * * * * * Q 
Q * * * * * * * 
* * Q * * * * * 
* * * * * Q * * 
-----------[solution 87]----------
* * * * * * Q * 
* * * Q * * * * 
* Q * * * * * * 
* * * * * * * Q 
* * * * * Q * * 
Q * * * * * * * 
* * Q * * * * * 
* * * * Q * * * 
-----------[solution 88]----------
* * * * * * Q * 
* * * * Q * * * 
* * Q * * * * * 
Q * * * * * * * 
* * * * * Q * * 
* * * * * * * Q 
* Q * * * * * * 
* * * Q * * * * 
-----------[solution 89]----------
* * * * * * * Q 
* Q * * * * * * 
* * * Q * * * * 
Q * * * * * * * 
* * * * * * Q * 
* * * * Q * * * 
* * Q * * * * * 
* * * * * Q * * 
-----------[solution 90]----------
* * * * * * * Q 
* Q * * * * * * 
* * * * Q * * * 
* * Q * * * * * 
Q * * * * * * * 
* * * * * * Q * 
* * * Q * * * * 
* * * * * Q * * 
-----------[solution 91]----------
* * * * * * * Q 
* * Q * * * * * 
Q * * * * * * * 
* * * * * Q * * 
* Q * * * * * * 
* * * * Q * * * 
* * * * * * Q * 
* * * Q * * * * 
-----------[solution 92]----------
* * * * * * * Q 
* * * Q * * * * 
Q * * * * * * * 
* * Q * * * * * 
* * * * * Q * * 
* Q * * * * * * 
* * * * * * Q * 
* * * * Q * * * 
    原文作者:回溯法
    原文地址: https://blog.csdn.net/booirror/article/details/43763197
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞