N皇后问题 HDU 杭电2553【递归回溯】
2015-08-03 17:45
495 查看
Problem Description
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
Input
共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
Output
共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
Sample Input
Sample Output
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
Input
共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
Output
共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
Sample Input
1 8 5 0
Sample Output
1 92 10
#include<stdio.h> #include<math.h> int x[15];//x数组表示放在该列的哪个位置,下标表示列,值表示放置在第几行 int sum, n; bool place (int v) { int i; for(i=1;i<v;++i) { if(x[i] == x[v] || abs(x[i]-x[v])==abs(i-v))//如果在同一行,或在对角线方向(为什么这里不判断是否为同一列呢?主要是因为x数组表示放在该列的哪个位置) return 0; } return 1; } void backtrack(int v) { int i; if(v>n) //把最后一个皇后放置成功后 sum++; else { for(i=1;i<=n;++i) //找n个皇后 { x[v]=i; if(place(v)) { backtrack(v+1); } } } } int main() { int ans[15]; for(n = 1; n <= 10; ++n) { sum = 0; backtrack(1); ans = sum; } while(scanf("%d",&n), n) { printf("%d\n",ans ); } return 0; }
相关文章推荐
- 1004 0-1背包问题
- Google命令行工具gflags使用
- QTableView实时更新数据
- 贪心之最大子矩阵和
- 分布式日志收集系统Apache Flume的设计详细介绍
- 如何分清负载均衡四、七层应用场景需求
- leetcode-225-Implement Stack using Queues
- API集市--分享API
- HDU 2159
- 白话空间统计之四:P值和Z得分(下)
- cv:mat
- MySQL定时器Events
- 在Android 中实现多参数文件和数据上传
- Unity5 打包assetbundle
- VS2010项目中添加lib库
- Implement Stack using Queues
- 三星Samsung笔记本电脑开机进入BIOS的方法与BIOS设置全功能菜单(F2)
- URAL 1900. Brainwashing Device(dp+输出路径)
- 批量学习和在线学习的区别
- LeetCode #217 Contains Duplicate