N皇后问题

输入:一个整数代表n*n方阵
输出:一个整数,代表有多少种情况

代码:

#include <iostream>
#include<cstdlib>

using namespace std;
const int MAXN=20;
int result[MAXN]={0};//result[i]代表第i行的皇后所在的列。
int used[MAXN]={0};//used[i]用来存第i列是否有皇后已经放置了。
int sum=0;
int mysize=0;

void dfs(int count){//第count行皇后的判断
if(count==mysize){//首先判断是否符合一种情况,如果符合就输出。
    for(int i=0;i<mysize;i++){
        printf("%d",result[i]);
    }
    printf("\n");
    sum++;
}
for(int i=0;i<mysize;i++){//做选择,判断哪一列还可以放皇后
    if(used[i]==0){
            bool flag=true;
            for(int j=0;j<count;j++){
                if(abs(i+1-result[j])==abs(j-count))//行减行的绝对值等于列减列的绝对值相等的话,意味着它们属于同一条斜对角线上。
                {flag=false;
                 break;

                }
            }
           if(flag==true){

            used[i]=1;
        result[count]=i+1;//如果符合就加入到结果中
        dfs(count+1);//进行递归
        used[i]=0;//递归过后恢复状态
            }
            }


    }
}






int main()
{scanf("%d",&mysize);
    dfs(0);
printf("一共有%d种情况",sum);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值