搜索
您的当前位置:首页正文

n皇后问题C++

来源:哗拓教育
#include<stdio.h>
#include<iostream> 
#include<cmath>
using namespace std;
//用一维数组存储,解决行冲突,数组下标为行数,数组值为列数 
int x[10]={0};
int count=0;
bool judge(int k)//判断第k行某个皇后是否发生冲突 ,发生冲突就跳过
{
    int i=1;
    while(i<k)  //循环i到k-1之前的皇后; 
    { 
        if(x[i]==x[k]||abs(x[i]-x[k])==abs(i-k))//存在列冲突或者存在对角线冲突(实际上就是一种剪枝)
            return false;
        i++;
    }
    return true;
}
void queen(int n)
{
    int i,k=1; //k为当前行号,从第一行开始 
    x[1]=0;//x[k]为第k行皇后所放的列号
    while(k>0)
    {
        x[k]++;  //首先从第一列开始判断 
        while(x[k]<=n&&!judge(k))//推导k行到底选择哪一列,如果当前该列不行则下一列,直到成立即可; 
          x[k]++;
        if(x[k]<=n)  
        {
            if(k==n)//输出所有解 
            {
                for(i=1;i<=n;i++)
                    //printf("第%d行的皇后:在第%d列  ",i,x[i]);
                    printf("%d ",x[i]);
                count++;
                //printf("-------这是其中第%d个解",count);   
                printf("\n");
            }
 
            else//判断下一行
            {
                k++; x[k]=0;
            }
        }
        else k--;//没找到,回溯
    }
    cout<<n<<"皇后问题有"<<count<<"个不同的解";
    return ;
}
int main()
{
    int n;
    cout<<"请输入你的n皇后:"; 
    cin>>n;//n最大值不超过10 
    cout<<n<<"皇后问题的解为"<<endl; 
    queen(n);
    return 0;
}

因篇幅问题不能全部显示,请点此查看更多更全内容

Top