HDU 2553N皇后问题
2016-07-29 20:09
393 查看
Description
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
Input
共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
Output
共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
Sample Input
1
8
5
0
Sample Output
1
92
10
思路:DFS深搜,只用一个map一维数组保存,每次搜索判断是否符合题意,不符合break;如果符合题意可以一直搜到n+1,此时次数加一return
最后判断总次数多少就行了。
代码:
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
Input
共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
Output
共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
Sample Input
1
8
5
0
Sample Output
1
92
10
思路:DFS深搜,只用一个map一维数组保存,每次搜索判断是否符合题意,不符合break;如果符合题意可以一直搜到n+1,此时次数加一return
最后判断总次数多少就行了。
代码:
#include<stdio.h> #include<string.h> int n,tmp; int map[11]; void DFS(int k) { int i,j,flag; if(k==n+1) { tmp++; return; } else { for(i=1;i<=n;++i) { map[k]=i; flag=1; for(j=1;j<k;++j) { if(map[j]==i||i-k==map[j]-j||i+k==map[j]+j) { flag=0; break; } } if(flag) DFS(k+1); } } } int main() { int i,m; int ans[11]; for(n=1;n<=10;++n) { tmp=0; DFS(1); ans =tmp; } while(scanf("%d",&m),m) { printf("%d\n",ans[m]); } return 0; }感觉最近做题越来越没有思路了哎!
相关文章推荐
- 重写与重载的区别
- HDU 5775 Bubble Sort (树状数组或线段树)
- 【BFS && DFS】模块小结
- 杂感与摘录
- 生活、工作点滴(二)
- yii框架中的邮件发送
- 在实际例子中学习正则表达式
- Leetcode 63. Unique Paths II (Medium) (cpp)
- HDU5769 Substring(后缀数组)
- 计算从1到N的自然数中取M个数的所有组合的lua函数
- 51nod 1007 正整数分组(平分) 01背包
- POJ-----3279暴力枚举
- PCM音频数据格式介绍
- TP框架-导入与导出
- 【前端】iterable类型的 forEach方法
- 记一次有趣的DirectX11程序闪屏的Debug过程
- APPIUM环境搭建
- linphone-KeepAliveReceiver.java文件分析
- Caffe中的Makefile.config的一些说明
- 二叉树的遍历