您的位置:首页 > 其它

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

2017-06-24 15:59 281 查看
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= 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: