八皇后、N皇后问题的求解。
来源:互联网 发布:linux上部署jenkins 编辑:程序博客网 时间:2024/04/30 09:38
开始我还不懂啥叫回溯,写完后一查发现好像我写的这个就是回溯耶
注:main函数第一行把输出流定位到txt文件,可在源的目录下查看哦
#include<cmath>#include<iostream>#include<stdio.h>using namespace std;#define N 11int used_colunmn[N]={0};//记录已经占用的列int a[N+1]={0};int loop[N+1]={0};void printqueen(int a[],int count){printf("\n%d:\n\n",count);//count之前多写了一个++,这个++不会继承下去,所以表现的就是整体的标号+1了for(int i=1;i<=N;i++){printf(" _");}printf("\n");for(int i=1;i<=N;i++){for(int j=1;j<a[i];j++)printf("|_");printf("|O");for(int j=a[i]+1;j<=N;j++)printf("|_");printf("|");printf("\n");}}bool ifexsist(int layer)//loop[2]==q||loop[2]==loop[1]||(abs(loop[1]-loop[2])<=1){bool judge=0;//坐标(x,y).本点(loop[layer],layer),前面的点:(a[i],i)if(layer!=1&&abs(loop[layer]-a[layer-1])<=1)return 0;for(int i=1;i<layer;i++){if(a[i]==loop[layer])//注意后边的变量是loopreturn 0;if(abs(loop[layer]-a[i])==abs(layer-i))//不在一条斜线上return 0;//else //这个else加的…………真是一坨屎}return 1;}void guess_queen(int layer){if(layer>N) return;for(loop[layer]=1;loop[layer]<=N;loop[layer]++)//for循环迭代,loop值被修改了!!//设计的没问题{if(layer==1)memset(a,0,(N+1)*sizeof(int));else{if(!ifexsist(layer))continue;//leave}a[layer]=loop[layer];if(layer==N){printqueen(a,++loop[0]);continue;//开始没加continue,但是影响不大}guess_queen(layer+1);}}int main(){freopen("queen.txt","w",stdout);printf("%d皇后问题——————\n",N);guess_queen(1);}//ifexist 犯了大错,else写的不是地方我还以为那个函数没问题//皇后终于调试完了,加了一个对角线条件,开始还以为写错了//这个计算的方法有缺点,不能求出排除对称的、旋转的解!//另外算法复杂度为n^n,不知道最好的解法速度如何?这个问题最开始我是求解5皇后,考虑的是该如何遍历各种可能的情况。
后来选择了用一维数组而不是二维数组,因为二维数组两个for嵌套,太臃肿了。
于是定义一个a[ ],其中元素的值代表所在的列数。也就是说,例如a[5+1]={0,1,2,3,4,5}就是对角线的排布。
然后嵌套了5层循环(好吧因为用一维数组确实不好思考)………
5皇后的问题搞定,下面的工作就是define一个N以能够实现n皇后问题。
然后欠的债早晚要还,开始把5层循环修改成迭代结构。
改迭代的时候出了一些问题,都在程序里注释了。中午睡了个觉脑子抽了把判断是否是解的函数ifexsist中多加了个else……
不过最终还是写好了!~!啥也没参考纯手写时间复杂度O(n^n)空间复杂度O(n)
附上解的个数——
解的个数
下表给出了 n 皇后问题的解的个数包括独立解U(OEIS中的数列A002562)以及互不相同的解D(OEIS中的数列A000170)的个数:
n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
..
24
25
26
U:
1
0
0
1
2
1
6
12
46
92
341
1,787
9,233
45,752
..
28,439,272,956,934
275,986,683,743,434
2,789,712,466,510,289
D:
1
0
0
2
10
4
40
92
352
724
2,680
14,200
73,712
365,596
..
227,514,171,973,736
2,207,893,435,808,352
22,317,699,616,364,044
不自量力的跑了一下25皇后…………太漫长了
然后还是跑14皇后吧!跑完之后发现txt竟然有166MB。。。
贴图纪念一下
- 八皇后、N皇后问题的求解。
- 八皇后 n皇后 问题
- 八皇后N皇后问题
- 八皇后问题求解
- 求解八皇后问题
- 八皇后问题求解
- 八皇后问题求解
- 八皇后问题求解
- 八皇后问题求解
- 八皇后问题求解
- 八皇后问题求解
- 求解n皇后问题
- 求解N皇后问题
- n皇后问题求解
- 八皇后问题,求解的个数
- 八皇后问题的递归求解
- 八皇后问题的回朔法求解
- N皇后问题的求解(C++代码)
- gridView适配
- freemarker的if标签
- ios5中UIViewController addChildViewController等新方法
- Cocos2d-x视频教程地址
- Hibernate接口Session详解
- 八皇后、N皇后问题的求解。
- 2015-01-08 工作小结
- 集成友盟社会化分享组件
- freemarker关于null的问题
- 《Effective C++》资源管理:条款13-条款15
- .net
- UVA11020 优势人群(multiset)
- Google Java编程风格指南
- 最大公约数和最小公倍数