九度OJ 1254:N皇后问题 (N皇后问题、递归、回溯)
2015-11-14 14:30
441 查看
时间限制:1 秒
内存限制:128 兆
特殊判题:否
提交:765
解决:218
题目描述:
N皇后问题,即在N*N的方格棋盘内放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在同一斜线上。因为皇后可以直走,横走和斜走如下图)。
![](http://www.jobdu.com/images/ac/1254/1254.png)
你的任务是,对于给定的N,求出有多少种合法的放置方法。输出N皇后问题所有不同的摆放情况个数。
输入:
输入包含多组测试数据。
每组测试数据输入一个整数n(3<n<=13),表示有n*n的棋盘,总共摆放n个皇后。
输出:
对于每组测试数据,输出总共不同的摆放情况个数,结果单独一行。
样例输入:
样例输出:
思路:
N皇后问题的常规解法是试探回溯法,能够给出所有解。如果只要得到一个解就行,那么还有随机解法。
相比常规解法,更高效的是位运算解法。
两者的详细介绍见我的另一篇文章《N皇后问题算法》。
代码:
内存限制:128 兆
特殊判题:否
提交:765
解决:218
题目描述:
N皇后问题,即在N*N的方格棋盘内放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在同一斜线上。因为皇后可以直走,横走和斜走如下图)。
![](http://www.jobdu.com/images/ac/1254/1254.png)
你的任务是,对于给定的N,求出有多少种合法的放置方法。输出N皇后问题所有不同的摆放情况个数。
输入:
输入包含多组测试数据。
每组测试数据输入一个整数n(3<n<=13),表示有n*n的棋盘,总共摆放n个皇后。
输出:
对于每组测试数据,输出总共不同的摆放情况个数,结果单独一行。
样例输入:
4
样例输出:
2
思路:
N皇后问题的常规解法是试探回溯法,能够给出所有解。如果只要得到一个解就行,那么还有随机解法。
相比常规解法,更高效的是位运算解法。
两者的详细介绍见我的另一篇文章《N皇后问题算法》。
代码:
#include <stdio.h> int n, allPlacedState, count; void queen(int row, int ld, int rd) { if (row != allPlacedState) { int pos = allPlacedState & ~(row | ld | rd); while (pos) { int p = pos & -pos; pos -= p; queen(row+p, (ld+p)<<1, (rd+p)>>1); } } else { count ++; } } int main() { while (scanf("%d", &n) != EOF) { allPlacedState = (1<<n)-1; count = 0; queen(0, 0, 0); printf("%d\n", count); } return 0; } /************************************************************** Problem: 1254 User: liangrx06 Language: C Result: Accepted Time:90 ms Memory:912 kb ****************************************************************/
相关文章推荐
- 用MATLAB进行部分分式展开
- 第三天-linux版本选择及安装
- UI基础-自定义视图、视图控制器
- 第十八天(待编辑状态)
- 如何删除NSDictionary或NSArray中的NSNull
- stl中的list学习笔记
- osg的fov解释
- 如何删除NSDictionary或NSArray中的NSNull
- ECMAScript——命名规范
- 第十七天
- ssh免密码设置
- 【CS】尺度不变特征变换匹配算法SIFT(3):RANSAC剔除错误匹配点
- VMWare虚拟机下为Ubuntu 14.04.1配置静态IP(NAT方式)
- Linux-查找命令的使用情况(持续更新)
- Delphi XE 如何实现("再按一次退出") 然后退出程序
- LeetCode74——Search a 2D Matrix
- Android中ImageView.ScaleType属性值
- 家长打孩子有10大危害
- U盘安装Ubuntu14.4时遇到分区问题记录
- 传统企业天天喊转型,究竟该怎么转