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

本文介绍了一个使用状态压缩动态规划解决N皇后问题的方法。通过枚举每一行皇后的位置,并利用位运算来标记已放置皇后的位置及对角线状态,实现了对所有可能摆放方案的有效搜索。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值