#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. Go语言之并发编程(一)

    轻量级线程(goroutine) 在编写socket网络程序时,需要提前准备一个线程池为每一个socket的收发包分配一个线程.开发人员需要在线程数量和CPU数量间建立一个对应关系,以保证每个任务能及 ...

  2. "帮你"-用户模板和用户场景

    场景/故事/story 典型用户: 用户性质 典型用户介绍 姓名 小李 年龄 20岁 职业 学生 代表的用户在市场上的比例和重要性 代表学校内广大普通学生,因此有很大的重要性. 使用本软件的典型场景 ...

  3. java对象转json格式

    package com; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import jav ...

  4. 有关js的一些小问题

    忘了从哪里找来抄下来的: js执行顺序问题 1.函数的声明和调用 “定义式”函数声明 function fn1() {......} "赋值式"函数声明 var f=functio ...

  5. 【Container With Most Water】cpp

    题目: Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, a ...

  6. Vue+Django REST framework打造生鲜电商项目

    1-1 课程导学 2-1 Pycharm的安装和简单使用 2-2 MySQL和Navicat的安装和使用 2-3 Windows和Linux下安装Python2和Python3 2-4 虚拟环境的安装 ...

  7. Detect Vertical&Horizontal Segments By OpenCV

    Detect Vertical&Horizontal Segments By OpenCV,and Save the data to csv. Steps: Using adaptiveThr ...

  8. 聊聊、Java 命令 第一篇

    网上很多讲 Javac 和 Java 命令的,我觉得还是要自己写一写,做一个自己的总结,也方便以后查询. 开始之前先看看 help 命令,基本上任何一个软件都会提供这个命令. 没有什么比 -help ...

  9. RESTful-rest_framework认证组件、权限组件、频率组件-第五篇

    认证组件.权限组件.频率组件总结:  认证组件格式: 1 写一个认证类 from rest_framework.authentication import BaseAuthentication cla ...

  10. sun.misc.BASE64Encoder()编码有换行符需要手动去除passwordEncode.replace("\n","");

    String passwordEncode = new BASE64Encoder().encodeBuffer(password.getBytes());//sun.misc.BASE64Encod ...