八皇后问题剪枝算法

已经判明不满足要求的情况不再递归求解,相当于从状态树上把它和它的子树减去了

#include 
#include 
#include 
using namespace std;
#define n 8
void queens(int chess[],int k,int &sum){
    //假设前k-1行都排列好了
    int i,j,tag;
    if(k<n){
        //第k行有八中取法
        for (i=0;i<n;i++) {
            chess[k]=i;tag=0;
            //对于第k行的每一种取法,需要检验它与前k-1行的每一个棋子是否在同一列或对角线上
            for (j=0;j<k;j++){
                if (chess[k] == chess[j] || abs(chess[k] - chess[j]) == abs(k - j))
                    tag = 1;
            }
            //如果第k行取得位置合适
            if(tag==0){
                //如果是最后一行,解法总数+1,并输出该解
                if(k==n-1){
                    sum++;
                    for (i=0;i<n;i++) {
                        cout<<chess[i]<<" ";
                    }
                    cout<<endl;
                }
                else
                    //如果不是最后一行,继续寻找下一行
                    queens(chess,k+1,sum);
            }
        }
    }
}
int main(){
    int chess[n];
    //行数从0开始
    memset(chess,0, sizeof(chess));
    int sum=0;
    queens(chess,0,sum);
    cout<<sum<<"个解"<<endl;
    return 0;
}

你可能感兴趣的:(数据结构与算法)