【题解】 状态压缩 CSYZOJ 1040 || codevs 1295 || hdu 2553 N皇后问题

hdu2553需要记忆化答案

就当我是来水博客的吧

不过确实跟我要讲的状压dp有关啊

当然不用在意CSYZOJ
只是对于YZOJ评测机卡我不爽


题目

题目描述

在N*N的棋盘上放置N个皇后(n<=10)而彼此不受攻击(即在棋盘的任一行,任一列和任一对角线上不能放置2个皇后),编程求解所有的摆放方法。

输入

一个数,N。

输出

每行输出一种方案,每种方案顺序输出皇后所在的列号,各个数之间有空格隔开。若无方案,则输出:”no solute!”

样例输入

4

样例输出

2 4 1 3
3 1 4 2

提示

1 <= N <= 8


题解

当然是每一行枚举列
压缩掉所放的列,和左右两个方向的对角线
画个图来观察第几条对角线和位置的关系即可处理对角线的表示


代码

#include <cstdio>

const int maxn = 10;
int n, res[maxn];
bool flag = false;
void dfs(int th, int col, int ri, int le){//column right left
    if (th > n){
        for (int i = 1; i <= n; ++i) printf ("%d ", res[i]);
        printf ("\n"); return ;
        flag = true;
    }
    int rit = th - 1, let = n - th;
    for (int i = 1, j; i <= n; ++i){
        if (!((col & (1 << i)) | (ri & (1 << rit + i)) | (le & (1 << let + i)))){
            res[th] = i;
            dfs(th + 1, col | (1 << i), ri | (1 << rit + i), le | (1 << let + i));
        }
    }
}
int main (){
    scanf ("%d", &n); dfs(1, 0, 0, 0);
    if (!flag) printf ("no solute!");

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值