C - N皇后问题

在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 <algorithm>
#include <cmath>
using namespace std; int queen[], q[]={}, N, sum=; int check(int n) {
for(int i=; i<n; i++)
if(queen[i]==queen[n] || abs(queen[i]-queen[n])==abs(n-i))
return ;
return ;
} void DFS(int n) {
for(int i=; i<N; i++){
queen[n] = i;
if(check(n)){
if(n == N-)
sum++;
else
DFS(n+);
}
}
} int main(){
while(scanf("%d",&N)!=EOF){
if(N==) break;
if(q[N]!=)
printf("%d\n",q[N]);
else{
DFS();
q[N] = sum;
printf("%d\n",sum);
sum = ;
}
} return ;
}

(1)打表。在main()中提前算出来从1到10的所有N皇后问题的答案,并存储在数组中,等读取输入后立刻输出。如果不打表,而是输入N后再单独计算输出,会超时。

(2)递归搜索DFS()。递归程序十分简洁,把第一个皇后按行放到棋盘上,然后递归放置其他的皇后,直到放完。

(3)回溯判断check()。判断新放置的皇后和已经放好的皇后在横向、纵向、斜对角方向是否冲突。其中,横向并不需要判断,因为在递归的时候已经是按不同行放置的。

(4)模块化编程。例如check()的内容很少,其实可以直接写在DFS()内部,不用单独写成一个函数。但是单独写成函数,把功能模块化,好处很多,例如逻辑清晰,容易差错等。建议在写程序的时候尽量把能分开的功能单独写成函数,这样可以大大减少编码和调试的时间。

												

最新文章

  1. 面试复习(C++)之归并排序
  2. Sphinx中文分词安装配置及API调用
  3. HDU-4527 小明系列故事——玩转十滴水 模拟
  4. 线程和NSThread 、 NSOperation
  5. 最近火到不行的微信小程序的常识
  6. jdbc 配置properties实现
  7. java对象群体的组织:Enumeration及Iterator类
  8. AMQ学习笔记 - 11. Spring-JmsTemplate之执行
  9. jQuery EasyUI 数据网格 - 启用行内编辑(转自http://www.runoob.com/jeasyui/jeasyui-datagrid-datagrid12.html)
  10. css overflow
  11. Java设计模式(四) 装饰 代理模式
  12. ARCGIS切图:TPK文件的空间参考为地理坐标系
  13. 痞子衡嵌入式:恩智浦i.MXRT系列微控制器量产神器RT-Flash用户指南
  14. FreeNas搭建踩坑指南(一)
  15. centOS设置开机自启
  16. IOS开发protocol使用
  17. springboot security
  18. day32-python阶段性复习六
  19. 如何通过Openssl实现私有CA,并为HTTP服务提供TLS/SLL安全机制
  20. Tomcat改端口号;修改访问路径,以及配置Context 标签以后Tomcat启动不了

热门文章

  1. python 处理10000个txt,每个文件夹里面放1000个。
  2. 关于ELF文件和BIN文件
  3. jenkins SSH发布文件 Publish over SSH
  4. 学习shiro最佳实践,绝对正确
  5. [未完成]ECRound 80
  6. js—求数组中的最大最小值
  7. R语言入门:向量索引
  8. 11种常用css样式之鼠标、列表和尺寸样式学习
  9. [javascript] test() 方法进行正则验证
  10. 生成JavaDoc文档