HDU 2553 N皇后问题
2016-07-17 11:47
302 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2553
N皇后问题
[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]
[align=left][/align]
[align=left]Sample Output[/align]
分析:题目意思就是在某一行的某一列放置一个皇后,然后在他的同一行,同一列以及45°对角线都不能放置皇后,求存在多少种放置方案。所以的话,我的思路就是用从第一行开始遍历,用一个数组id[i]表示第i行的皇后放置在哪一列。由于我是按行遍历的,因此在考虑当前行当前列是否可以放置的时候,只需要考虑是否同一列或者在45°对角线上,同一列的问题,可以考虑cur行之前的放置情况,用id[cur]与id[i]来判断,cur表示当前行;对角线的问题,很容易可以发现,判断它们斜率的绝对值是否等于1(紫书上也有一种判断方法,菜鸟没看懂,只能用自己的方法来判断),如果可以放置,则进行cur+1行的操作,直到n-1行,否则考虑另一列。判断一套方案是否成立的条件是cur==n。下面代码用了预处理的方法~
下面上代码:
N皇后问题
[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][/align]
[align=left]Sample Output[/align]
1 92 10
分析:题目意思就是在某一行的某一列放置一个皇后,然后在他的同一行,同一列以及45°对角线都不能放置皇后,求存在多少种放置方案。所以的话,我的思路就是用从第一行开始遍历,用一个数组id[i]表示第i行的皇后放置在哪一列。由于我是按行遍历的,因此在考虑当前行当前列是否可以放置的时候,只需要考虑是否同一列或者在45°对角线上,同一列的问题,可以考虑cur行之前的放置情况,用id[cur]与id[i]来判断,cur表示当前行;对角线的问题,很容易可以发现,判断它们斜率的绝对值是否等于1(紫书上也有一种判断方法,菜鸟没看懂,只能用自己的方法来判断),如果可以放置,则进行cur+1行的操作,直到n-1行,否则考虑另一列。判断一套方案是否成立的条件是cur==n。下面代码用了预处理的方法~
下面上代码:
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> using namespace std; int id[12]; int n; int count1; int a[12]; void dfs(int cur,int t) { if(cur==t) { a[t]++; } else { for(int i=0;i<t;i++) { id[cur]=i; int flag=1; for(int j=0;j<cur;j++) { if(id[cur]==id[j]||abs(cur-j)==abs(id[cur]-id[j])) { flag=0; break; } } if(flag==1) dfs(cur+1,t); } } } int main() { memset(a,0,sizeof(a)); for(int i=1;i<=10;i++) { dfs(0,i); } while(~scanf("%d",&n)&&n) { printf("%d\n",a ); } return 0; }
相关文章推荐
- Win2003利用dfs(分布式文件系统)在负载均衡下的文件同步配置方案
- win2003分布式文件系统(dfs)配置方法[图文详解]
- win2003分布式文件系统及其部署 图文教程
- Hadoop2.6+jdk8的安装部署(1)——使用jar包安装部署【详细】
- Hadoop FS Shell
- DFS使用方法总结
- FastDFS注意事项
- 无忧技术带您预览DFS(分布式文件系统)管理控制台
- C 语言实现迷宫 DFS算法
- 【HDU 5366】The mook jong 详解
- 【HDU 2136】Largest prime factor 详细图解
- 【HDU 1568】Fibonacci 数学公式 详解
- 一幅图弄清DFT与DTFT,DFS的关系
- HDFS---Namenode
- HDFS ---- Services startup
- HDU 1568
- HDU1290
- POJ1523 SPF dfs
- HDU1568(Fobonacci公式)
- HDU ACM Step 2.2.2 Joseph(约瑟夫环问题)