#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皇后问题递归解法的更多相关文章

  1. [LeetCode系列]N皇后问题递归解法 -- 位操作方式

    N皇后问题: 给定8*8棋盘, 放置n个皇后, 使其互相不能攻击(即2个皇后不能放在同一行/列/正反对角线上), 求解共有多少种放置方式? 这个问题的解答网上有不少, 但是位操作解法的我看到的不多. ...

  2. 八皇后问题 --- 递归解法 --- java代码

    八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行.纵行或斜线上.八皇后 ...

  3. 比赛组队问题 --- 递归解法 --- java代码 --- 八皇后问题

    两队比赛,甲队为A.B.C3人,乙队为X.Y.Z3人.已知A不和X比,C不和X.Z比,请编程序找出3队赛手名单 采用了与八皇后问题相似的解法,代码如下: 如有疑问请链接八皇后问题的解法:http:// ...

  4. [Python3 练习] 006 汉诺塔2 非递归解法

    题目:汉诺塔 II 接上一篇 [Python3 练习] 005 汉诺塔1 递归解法 这次不使用递归 不限定层数 (1) 解决方式 利用"二进制" (2) 具体说明 统一起见 我把左 ...

  5. YTU 3013: 皇后问题(递归)

    3013: 皇后问题(递归) 时间限制: 1 Sec  内存限制: 128 MB 提交: 2  解决: 2 题目描述 编写一个函数,求解皇后问题:在n*n的方格棋盘上,放置n个皇后,要求每个皇后不同行 ...

  6. 洛谷P2105 K皇后

    To 洛谷.2105 K皇后 题目描述 小Z最近捡到了一个棋盘,他想在棋盘上摆放K个皇后.他想知道在他摆完这K个皇后之后,棋盘上还有多少了格子是不会被攻击到的. (Ps:一个皇后会攻击到这个皇后所在的 ...

  7. [LeetCode系列]爬梯问题的递归解法转换为迭代解法

    有一个n阶的梯子, 你每次只能爬1阶或2阶, 请问共有多少种登顶的爬法?(正好爬完n阶, 不能多也不能少) 本题最优解是直接套用菲波那切数列即可(因为菲波那切数列的第n个元素正好等于第n-1个元素和第 ...

  8. 洛谷2105 k皇后

    P2105 K皇后 题目描述 小Z最近捡到了一个棋盘,他想在棋盘上摆放K个皇后.他想知道在他摆完这K个皇后之后,棋盘上还有多少了格子是不会被攻击到的. (Ps:一个皇后会攻击到这个皇后所在的那一行,那 ...

  9. 洛谷 P2105 K皇后

    P2105 K皇后 题目描述 小Z最近捡到了一个棋盘,他想在棋盘上摆放K个皇后.他想知道在他摆完这K个皇后之后,棋盘上还有多少了格子是不会被攻击到的. (Ps:一个皇后会攻击到这个皇后所在的那一行,那 ...

随机推荐

  1. 笔记-编程-IO模型

    笔记-编程-IO模型 1.      简介 常用IO模型 1)      同步阻塞IO(Blocking IO) 2)      同步非阻塞IO(Non-blocking IO) 3)      IO ...

  2. golang echo livereload

    echo on port 1323 gin -a 1323 run server.go go get github.com/codegangsta/gin gin -h

  3. kettle Spoon.bat闪退解决办法!

    1.Java环境配置问题: java_home:D:\Program Files\Java\jdk1.7.0_25(安装jdk路径) classpath:.;%java_home%\lib\dt.ja ...

  4. Android TV 开发(2)

    本文来自网易云社区 作者:孙有军 首先来看看拨号界面的配置代码: <LinearLayout xmlns:android="http://schemas.android.com/apk ...

  5. IOS笔记048-数据存储

      IOS数据存储的几种方式         XML属性列表(plist)         归档 Preference(偏好设置)          NSKeyedArchiver归档(NSCodin ...

  6. Windows核心编程小结1

    这本书绝对经典,看看定会增加不少知识.当然这本书有很多东西比<Windows程序设计第五版>中的更加详细. 1.Unicode:宽字节字符集 这是一个国际的字符标准,16位,最大可支持65 ...

  7. Python-S9——Day115-Flask Web框架

    01 当日内容概要 1 当日内容概要 1.1 Flask基础: 1.2 Web框架包含的基础组件: 1.2.1 路由.视图函数.模板渲染: 1.3 Flask配置文件: 1.4 Flask的路由系统: ...

  8. C# 调试之 Debug.WriteLine()、Trace.WriteLine()

    Trace 类 和 Debug 类的区别在于,Trace 类会同时在 Debug.Release 模式下起作用,而 Debug 只作用在 Debug 模式下. 区别: 1. 输出跟踪信息 Trace. ...

  9. macOS Sierra 触控板无法三指拖移窗口、三指选中文字的解决方法

    问题:升级macOS Sierra新系统后,发现触摸板无法进行三指拖移窗口.三指选定文字的操作.在“系统偏好设置”——“触控板”内无法进行设置. 解决:“系统偏好设置”——“辅助功能”——“鼠标与触控 ...

  10. springmvc和struts2的区别比较

    1.Struts2是类级别的拦截, 一个类对应一个request上下文,SpringMVC是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应,所以说从架构本身上Spr ...