P1219_洛谷_八皇后

#include<iostream>
using namespace std;
const int N=30;
int n,ans;
int pos[N];//p[i]用来标记棋子放在第i行 其值表示放在哪一列
//保证棋子满足没有跟它同行 同对角线的棋子
int c[N];//c[j]表示棋子放在第j列 1表示它已经占领了位置 0表示没有
int p[N];//p[i+j]表示撇对角线 1表示其他棋子不能放棋 0表示可以放 易错点
int q[N];//q[i-j+n]表示捺对角线 1表示其他棋子不能放棋 0表示可以放

void print(){
    if(ans<=3){//只输出前3种放案 按字典序
        for(int i=1;i<=n;i++){
            printf("%d ",pos[i]);//输出棋子所在列
        }
        printf("\n");
    }
}

void dfs(int i){
    if(i>n){//枚举所有的行之后 开始判定输出解决方案
        ans++;print();return;
    }
    //从第1列开始枚举
    for(int j=1;j<=n;j++){
        //出现互斥关系 就不能放棋子
        if(c[j]||p[i+j]||q[i-j+n])continue;
        pos[i]=j;//占领位置
        c[j]=p[i+j]=q[i-j+n]=1;//锁定同行、同列以及对角线
        dfs(i+1);//枚举下一行
        c[j]=p[i+j]=q[i-j+n]=0;//恢复现场
    }
}

int main(){
    cin>>n;
    dfs(1);//从第1行第1列枚举
    printf("%d",ans);//输出总方案数
    return 0;
}

小知识点:

1)按行搜索空间

2)对角线与行列的映射关系 p[i+j] q[i-j+n]

3)N之所以开到30,是因为 p的范围为 【2,2*n】 q的范围为【1,2*n-1】 n最大取13,防止越界,因而开到30.

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值