K皇后问题递归解法
#include<iostream>
#include<cmath>
#include<ctime>
using namespace std; bool check(int row,int *a)
{
for(int i=;i<row;i++)
if (a[i]==a[row] || fabs(a[i]-a[row])==fabs(i-row))
return false;
return true;
} void show(int *a,int num,int k)
{
cout<<"the "<<num<<" answer is:"<<endl;
cout<<"-------------------"<<endl;
for(int i=;i<k;i++)
for(int j=;j<k;j++)
{
if (a[i]==j)
cout<<'*';
else cout<<'o';
if ((j+)%k==)
cout<<endl;
}
}
void findpos(int row,int *a,int &num,int k)
{
if(row==k)
{
num+=;
show(a,num,k);
}
else{
for(int i=;i<k;i++)
{
a[row]=i;
if(check(row,a))
findpos(row+,a,num,k);
}
}
}
int main(void)
{
int k;
cout<<"the number of que is:";
cin>>k;
int *a=new int[k];//记录每行皇后对应的列
int num=;//记录解的数量 clock_t start,end;
start=clock(); findpos(,a,num,k);
delete [] a; end=clock();
double totaltime=double((end-start))/CLOCKS_PER_SEC;//clock_t相当于long型
cout<<"time elapses "<<totaltime<<" seconds";
system("pause");
return ;
}
利用位运算来计算K皇后问题解的个数,有些限制,是Matrix67提到的方法,bitmap的思想,速度快,内存小
#include<iostream>
#include<ctime>
using namespace std;
void Queen(int column,int ld,int rd,int k, int &num)
{
//column,ld,rd中1表示禁位
int upperlim=(1<<k)-1;//01111
int pos,p;
if(column!=upperlim)//列还有空位
{
pos=upperlim & ~(column|ld|rd);//ld,rd? 取反后1表示可以放的位置
while(pos !=0)
{
p=pos & -pos;//01001->00001 取出最右面的一个1
pos-=p; Queen(column+p,(ld+p)<<1,(rd+p)>>1,k,num);//每向下移一行,对角线的禁位要要偏移一个单位
}
//取完所有可放的位置
}
else num+=1;// 当列放满时,一次大循环结束 }
void ToTwo(int n)
{
for(int i=0;i<32;i++,n<<=1) cout<<(n<0);
}
int split(int n,int k)
{
return n & ((1<<k)-1);
} int main(void)
{
clock_t start,end;
int k,num=0;
cout<<"皇后的数量:";//因为是用利用位代替了数组的传递,还有一位要用来移位时溢出
//这里int型决定了最大31个皇后
cin>>k;
start=clock();
Queen(0,0,0,k,num);
cout<<num<<endl;
end=clock();
double totaltime=double(end-start)/CLOCKS_PER_SEC;
cout<<"time elapse: "<<totaltime<<" seconds"<<endl;
return 0;
}
//16个皇后,14772512,40s
K皇后问题递归解法的更多相关文章
- [LeetCode系列]N皇后问题递归解法 -- 位操作方式
N皇后问题: 给定8*8棋盘, 放置n个皇后, 使其互相不能攻击(即2个皇后不能放在同一行/列/正反对角线上), 求解共有多少种放置方式? 这个问题的解答网上有不少, 但是位操作解法的我看到的不多. ...
- 八皇后问题 --- 递归解法 --- java代码
八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行.纵行或斜线上.八皇后 ...
- 比赛组队问题 --- 递归解法 --- java代码 --- 八皇后问题
两队比赛,甲队为A.B.C3人,乙队为X.Y.Z3人.已知A不和X比,C不和X.Z比,请编程序找出3队赛手名单 采用了与八皇后问题相似的解法,代码如下: 如有疑问请链接八皇后问题的解法:http:// ...
- [Python3 练习] 006 汉诺塔2 非递归解法
题目:汉诺塔 II 接上一篇 [Python3 练习] 005 汉诺塔1 递归解法 这次不使用递归 不限定层数 (1) 解决方式 利用"二进制" (2) 具体说明 统一起见 我把左 ...
- YTU 3013: 皇后问题(递归)
3013: 皇后问题(递归) 时间限制: 1 Sec 内存限制: 128 MB 提交: 2 解决: 2 题目描述 编写一个函数,求解皇后问题:在n*n的方格棋盘上,放置n个皇后,要求每个皇后不同行 ...
- 洛谷P2105 K皇后
To 洛谷.2105 K皇后 题目描述 小Z最近捡到了一个棋盘,他想在棋盘上摆放K个皇后.他想知道在他摆完这K个皇后之后,棋盘上还有多少了格子是不会被攻击到的. (Ps:一个皇后会攻击到这个皇后所在的 ...
- [LeetCode系列]爬梯问题的递归解法转换为迭代解法
有一个n阶的梯子, 你每次只能爬1阶或2阶, 请问共有多少种登顶的爬法?(正好爬完n阶, 不能多也不能少) 本题最优解是直接套用菲波那切数列即可(因为菲波那切数列的第n个元素正好等于第n-1个元素和第 ...
- 洛谷2105 k皇后
P2105 K皇后 题目描述 小Z最近捡到了一个棋盘,他想在棋盘上摆放K个皇后.他想知道在他摆完这K个皇后之后,棋盘上还有多少了格子是不会被攻击到的. (Ps:一个皇后会攻击到这个皇后所在的那一行,那 ...
- 洛谷 P2105 K皇后
P2105 K皇后 题目描述 小Z最近捡到了一个棋盘,他想在棋盘上摆放K个皇后.他想知道在他摆完这K个皇后之后,棋盘上还有多少了格子是不会被攻击到的. (Ps:一个皇后会攻击到这个皇后所在的那一行,那 ...
随机推荐
- 下载速度更加快的 SourceForge 镜像
http://www.mirrorservice.org/sites/download.sourceforge.net/pub/sourceforge/是 University of Kent的镜像, ...
- UVALive 4685 Succession 树DP+背包
一.前言 这道题同样来自于红书P142,作为树DP专题中的一道比较难的题目,A了一天左右的时间,看上去事实证明,这题的难度理我本身的实力还是有些太远了,于是正确的做法应该是分析一下题目之后进行解析什么 ...
- 为什么要用枚举实现Singleton--Java
原文地址:http://www.cnblogs.com/AprilCal/p/5426007.html 理由一:无需再考虑可序列化的情况 <effective java>第77条:对于 ...
- JVM——Java类加载机制总结
)解析:解析阶段是把虚拟机中常量池的符号引用替换为直接引用的过程. 2.3 初始化 类初始化时类加载的最后一步,前面除了加载阶段用户可以通过自定义类加载器参与以外,其余都是虚拟机主导和控制.到了初始化 ...
- loj6392 「THUPC2018」密码学第三次小作业 / Rsa
还是挺好做的,\((e_1,e_2)=1 \Rightarrow e_1s+e_2t=0\),\(m \equiv m^1 \equiv m^{e_1s+e_2t} \equiv c_1^s c_2^ ...
- iOS下单例模式实现(二)利用宏定义快速实现
在上一节里提到了用利用gcd快速实现单例模式. 一个项目里面可能有好几个类都需要实现单例模式.为了更高效的编码,可以利用c语言中宏定义来实现. 新建一个Singleton.h的头文件. // @int ...
- 【Triangle 】cpp
题目: Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjace ...
- Python+Selenium练习篇之18-获取元素上面的文字
本文介绍如何通过Selenium方法来获取某一个元素的text属性值.在很多自动化测试脚本中,需要多次获取元素的text值,拿过来进行对比和匹配.例如,在一个登陆界面,如果不输入用户名和密码,直接点击 ...
- JWT实现token的生成和认证demo
上篇写到对JWT的理解,这篇写一个小的demo来实践下 Github:https://github.com/wuhen152033/token/tree/dev 简介 本次的demo是基于Spring ...
- 用python批量下载贴吧图片 附源代码
环境:windows 7 64位:python2.7:IDE pycharm2016.1 功能: 批量下载百度贴吧某吧某页的所有帖子中的所有图片 使用方法: 1.安装python2.7,安装re模块, ...