n后问题————回溯法求解(递归与非递归)

来源:互联网 发布:数据库基础知识总结 编辑:程序博客网 时间:2024/06/05 02:02

N后问题要求在一个n*n格的棋盘上放置n个皇后,使得他们彼此不受攻击。按照国际象棋的规则,一个皇后可以攻击与之处在同一行或同一列或同一斜线上的其他任何棋子。因此,n后问题等价于要求在一个n*n的棋盘上放置n个皇后,使得任何2个皇后不能被放在同一行或同一列或同一斜线上。

用回溯法解n后问题时,可以用一颗完全n叉树来表示其解空间。用可行性约束函数Place可剪去不满足行、列和斜线约束的子树。*

#include<iostream>using namespace std;class Queen{    int n;//多少个皇后    int *x;//当前解    int sum;//总共有几种方法    bool Place(int k)//检查可行性    {        for(int i = 0;i<k;++i)        {            if((x[i] == x[k]) || (abs(i-k) == abs(x[i]-x[k])))            {                //不能放在同一行或同一列或同一斜线上                return false;            }        }        return true;    }    void Backtrack(int k)//递归    {        if(k == n)        {            sum+=1;            for(int i = 0;i<n;++i)            {                for(int j = 0;j<n;++j)                {                    if(x[j] == i)                    {                        cout<<"Q ";                    }                    else                    {                        cout<<"# ";                    }                }                cout<<endl;            }            cout<<endl;        }        else        {            for(int j = 0;j<n;++j)            {                x[k] = j;                if(Place(k))                {                    Backtrack(k+1);                }            }        }    }    /*    void Backtrack()    {        x[0] = -1;        int k = 0;        while(k >= 0)        {            //x[k]表示皇后k放在棋盘的第k行的第x[k]列            x[k] +=1;            while(x[k] < n && !Place(k)) x[k] +=1;//不符合条件列++            if(x[k] < n)            {                if(k  == n-1)                {                    sum++;                    for(int i = 0;i<n;++i)                    {                        for(int j = 0;j<n;++j)                        {                            if(x[j] ==i)                            {                                cout<<"Q ";//皇后放置的位置                            }else                            {                                cout<<"# ";                            }                        }                        cout<<endl;                    }                    cout<<endl;                }else                {                    k++;                    x[k] = -1;                }            }            else            {                --k;            }        }    }    */public:    friend int nQueen(int n);};int nQueen(int n)//对Queen的成员变量初始化{    Queen Q;    Q.n = n;    Q.sum = 0;    Q.x = new int[n];    for(int i = 0;i<n;++i) Q.x[i] = 0;    Q.Backtrack();    delete []Q.x;    return Q.sum;}void main(){    int n;    int sum = 0;    cin>>n;    sum = nQueen(n);    cout<<sum<<endl;}

程序运行结果
//4个皇后总共2种解法,Q为皇后放置的位置

原创粉丝点击