n皇后问题

#include <stdio.h>
#include <cstring>
#include <iostream>
#include <cmath>
using namespace std;
int x[20],sum=0,n;
//输出 
void output(){
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(x[i]==j) cout<<" Q";
            else cout<<" *"; 
        } 
        cout<<endl;
    }
    cout<<endl;

//检查是否是正确位置 
int check(int k){
    for(int i=1;i<=k-1;i++){
        if((abs(x[k]-x[i])==abs(k-i))||(x[k]==x[i])) return 0;
    }
    return 1;
}

/****************非递归******************/ 
//搜索过程 
void huisu(int n){
    //sum=0;
    memset(x,0,sizeof(x));
    int k=1;//初始化从第一个开始 ,为行 
    while(k>0){
        x[k]=x[k]+1;//列 
        while(x[k]<=n && !check(k)) x[k]=x[k]+1;
        if(x[k]<=n){ //列 ,找到一个位置且合法 
            if(k==n){
                output();//输出路径 
                sum++; //若为最后一个皇后,可行解个数加 1 
            }
            else{ //不是最后一个 
                k++; //转到下一行,给下一个皇后找位置 
                x[k]=0;   //从头开始搜索 
            }
        }
        else k--; //若第k行所有列都无法放置某皇后,回溯到上一行,到该行的的下一列 
    } 
}
int main(){  
    sum=0;//皇后个数,可行路径个数 
    cin>>n; 
    int x[20]; // x[i]=k表示第 i 行的 第 k 个位置放置一个皇后 
    memset(x,0,sizeof(x)); //初始化为0 
    huisu(n); //搜索 
    printf("%d皇后问题共有%d种摆放方案\n",n,sum);
}  

/*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*/

#include <stdio.h>
#include <cstring>
#include <iostream>
#include <cmath>
using namespace std;
int x[20],sum=0,n;

//输出 

void output(){
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(x[i]==j) cout<<" Q";
            else cout<<" *"; 
        } 
        cout<<endl;
    }
    cout<<endl;

//检查是否是正确位置 
int check(int k){
    for(int i=1;i<=k-1;i++){
        if((abs(x[k]-x[i])==abs(k-i))||(x[k]==x[i])) return 0;
    }
    return 1;
}

/****************递归******************/ 
//搜索过程 
void huisu(int t){
    for(int i=1;i<=n;i++){//n个皇后 ,第一次从 1 开始 
        x[t]=i; //放到当前循环到的位置 
        if(check(t)){
            if(t==n){ //最后一个皇后 
                output();
                sum++;
            }
            else{
                huisu(t+1); //继续下一个 
            }
        }
    }
}

int main(){  
    sum=0;//皇后个数,可行路径个数 
    cin>>n; 
    int x[20]; // x[i]=k表示第 i 行的 第 k 个位置放置一个皇后 
    memset(x,0,sizeof(x)); //初始化为0 
    huisu(1); //搜索 
    printf("%d皇后问题共有%d种摆放方案\n",n,sum);
}  
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值