HDU-2553-N皇后问题【DFS】
2016-07-29 15:15
295 查看
N皇后问题
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 18328 Accepted Submission(s): 8289
[align=left]Problem Description[/align]
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
[align=left]Input[/align]
共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
[align=left]Output[/align]
共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
[align=left]Sample Input[/align]
1
8
5
0
[align=left]Sample Output[/align]
1
92
10
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; int map[20]; // 用来记录皇后在某行某列 如 map[a]=b 就表示皇后在 a 行 b 列 int ans[20]; // 用于打表记录 N 皇后的个数 int n,sum; bool judge(int v) // 判断放该皇后 前几列的情况 { for(int i=1;i<v;i++) { if(map[v]==map[i]||abs(map[v]-map[i])==abs(v-i)) // 判断两个皇后 是否在同一列 是否在对角线上 return 0; } return 1; } void DFS(int v) { if(v>n) { sum++; return; } for(int i=1;i<=n;i++) { map[v]=i; //记录皇后在 v 行的 i 列;第一次皇后从第一行第一列摆放,n个皇后全部放完后,结束;第二次从第一行第二列摆放;依次摆放到第一行第n列 if(judge(v)) { DFS(v+1); } } } int main() { for(n=1;n<=10;n++) { sum=0; memset(map,0,sizeof(map)); DFS(1); ans =sum; } while(scanf("%d",&n)&&n) { printf("%d\n",ans ); } return 0; }
相关文章推荐
- java zip 批量打包(java.util包和apache.tools包)
- SWIFT推送之本地推送(UILocalNotification)
- Java集合,文章收藏
- Glide,Google推荐的图片加载库
- The dependency `***` is not used in any concrete target.
- APP开发之初:自定义NavigationController,拦截所有push方法.
- Java包装类
- ORACLE函数之日期时间运算函数
- 简单实现固定表格的上表头、左表头
- mysql mysqldump只导出表结构或只导出数据的实现方法
- 彻底解决Android GPS没法定位这一顽固问题
- 初识贪心!——hdu 2037
- Android通知
- 详解Javaweb中常见漏洞的防御二
- switch 语句
- 利用OpenCV的VideoWriter类实现视频的写操作
- Tomcat安装配置
- 深入理解Android之Gradle
- percona
- 设计模式(一)单例模式