HDU2553——N皇后问题(dfs)
2015-12-03 19:58
253 查看
Description
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
Input
共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
Output
共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
Sample Input
1
8
5
0
Sample Output
1
92
10
k代表列数,vis是指第k列不能再放置皇后
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
Input
共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
Output
共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
Sample Input
1
8
5
0
Sample Output
1
92
10
#include <iostream> #include <cstring> #include <cstdio> #include <cstdlib> using namespace std; int n,map[15],vis[15],sol[15],ans; void dfs(int k) { int i,j,flag; if(k==n+1) { ans++; return; } for(i=1; i<=n; ++i) if(!vis[i]) { map[k]=i; flag=1; for(j=1; j<=k-1; ++j) if((map[k]-map[j]==k-j)||(map[k]-map[j]==j-k)) { flag=0; break; } if(flag) { vis[i]=1; dfs(k+1); vis[i]=0; } } } int main() { for(int i=1; i<=10; ++i) { ans=0; n=i; memset(vis,0,sizeof(vis)); memset(map,0,sizeof(map)); dfs(1); sol[i]=ans; } while(scanf("%d",&n)&&n) { printf("%d\n",sol ); } return 0; }
k代表列数,vis是指第k列不能再放置皇后
相关文章推荐
- 开机 弹出msn中文网 解决
- Cache技术整理
- va_list原理及用法
- [TwistedFate]iOS网络编程
- Android无法自动创建USB打印机节点/dev/usb/lp0
- Android开发 通过JNI实现JAVA与C/C++程序间的调用和回调
- C plus plus(4)---参数传递
- dView实现checkbox全选反选(自带的ShowSelectCheckBOx)并获取选中checkbox对应的值集合
- BZOJ1005: [HNOI2008]明明的烦恼
- debian下没有公钥解决办法
- 全选和地区联动
- Mysql查询缓存
- printf,sprintf,vsprintf 区别
- fighting
- 几个常见的 Socket 连接错误及原因[转]
- 数据结构之Huffman树与最优二叉树
- IOS多线程读写Sqlite问题解决
- Android自学之路,ToolBar的使用标题居中颜色设置
- PCL—低层次视觉—点云分割(基于形态学)
- [转载]C语言头文件的作用