【题解】 状态压缩 CSYZOJ 1040 || codevs 1295 || hdu 2553 N皇后问题
2017-06-24 15:59
281 查看
hdu2553需要记忆化答案
就当我是来水博客的吧
不过确实跟我要讲的状压dp有关啊
当然不用在意CSYZOJ
只是对于YZOJ评测机卡我不爽
3 1 4 2
压缩掉所放的列,和左右两个方向的对角线
画个图来观察第几条对角线和位置的关系即可处理对角线的表示
就当我是来水博客的吧
不过确实跟我要讲的状压dp有关啊
当然不用在意CSYZOJ
只是对于YZOJ评测机卡我不爽
题目
题目描述
在N*N的棋盘上放置N个皇后(n<=10)而彼此不受攻击(即在棋盘的任一行,任一列和任一对角线上不能放置2个皇后),编程求解所有的摆放方法。输入
一个数,N。输出
每行输出一种方案,每种方案顺序输出皇后所在的列号,各个数之间有空格隔开。若无方案,则输出:”no solute!”样例输入
4样例输出
2 4 1 33 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; } 相关文章推荐
- 【题解】 状态压缩 CSYZOJ 1040 || codevs 1295 || hdu 2553 N皇后问题
- hdu-2553 N皇后问题(深搜 + 状态压缩)
- Codevs P1295 N皇后问题
- HDU 2553 N皇后问题(2种详细题解)
- code【vs】1295 N皇后问题(dfs(回溯))
- codevs1295 N皇后问题 解题报告
- HDU 2553 N皇后问题(详细题解)
- Codevs 1295 N皇后问题
- 【codevs1295 N皇后问题(不输出方案)】回溯法
- HDU 2553 N皇后问题(详细题解)
- 从零开始的暴搜复习生活—DFS(CODE[VS] 1116 四色问题 1294 全排列 1295 N皇后问题)
- CODE[VS] 1295 N皇后问题
- 【codevs1295】 N皇后问题
- 【DFS】CODE[VS] 1295 N皇后问题(刷题记录)
- CodeVS 1295 N皇后问题 题解
- CODE[VS] 1295 N皇后问题
- 【codevs1295 N皇后问题(不输出方案)】回溯法
- CODE[VS] 1295 N皇后问题
- 深度优先搜索 之 CODE[VS] 1295 N皇后问题
- Code[VS] 1295 Nqueens N皇后问题