C++递归问题之二——n皇后问题:以四、八皇后为例,给定n个皇后要求将它们放在一个n维矩阵中,任意两个皇后不能出现在同一行、列、主副对角线上,输出具体的摆放方式
2012-05-04 23:50
701 查看
#include <iostream>
using namespace std;
class Queen{
public:
Queen(){}
Queen(int i):Qnum(i){}
~Queen(){}
void SetQnum(int i){
Qnum=i;
}
void FindPos();
private:
enum{MAX=10};
int col[MAX];
int M[2*MAX];
int S[2*MAX];
int matrix[MAX][MAX];
int Qnum;
int count;
void Find(int i);
void Init();
};
void Queen::FindPos(){
Init();
Find(0);
}
void Queen::Init(){
count=0;
for(int i=0;i<MAX;++i){
col[i]=0;
for(int j=0;j<MAX;++j)matrix[i][j]=0;
}
for(i=0;i<2*MAX;++i)M[i]=S[i]=0;
}
void Queen::Find(int i){
for(int j=0;j<Qnum;++j){
if(col[j]==0&&M[i-j+Qnum-1]==0&&S[i+j]==0){//列、主对角线、辅对角线,-1起标示作用在矩阵中表示放皇后的位置
col[j]=-1;
M[i-j+Qnum-1]=-1;
S[i+j]=-1;
matrix[i][j]=-1;
if(i<Qnum-1)Find(i+1);
else{
cout<<"No."<<++count<<" result:"<<endl;
for(int iL=0;iL<Qnum;++iL){
for(int jC=0;jC<Qnum;++jC)
cout<<matrix[iL][jC]<<'\t';
cout<<endl;
}
cout<<endl;
}
col[j]=0;
M[i-j+Qnum-1]=0;
S[i+j]=0;
matrix[i][j]=0;
}
}
}
int main(){
cout<<"Input the num of queen:"<<endl;//暂时只处理4、8皇后
int num;
cin>>num;
Queen obj(num);
obj.FindPos();
return 0;
}
using namespace std;
class Queen{
public:
Queen(){}
Queen(int i):Qnum(i){}
~Queen(){}
void SetQnum(int i){
Qnum=i;
}
void FindPos();
private:
enum{MAX=10};
int col[MAX];
int M[2*MAX];
int S[2*MAX];
int matrix[MAX][MAX];
int Qnum;
int count;
void Find(int i);
void Init();
};
void Queen::FindPos(){
Init();
Find(0);
}
void Queen::Init(){
count=0;
for(int i=0;i<MAX;++i){
col[i]=0;
for(int j=0;j<MAX;++j)matrix[i][j]=0;
}
for(i=0;i<2*MAX;++i)M[i]=S[i]=0;
}
void Queen::Find(int i){
for(int j=0;j<Qnum;++j){
if(col[j]==0&&M[i-j+Qnum-1]==0&&S[i+j]==0){//列、主对角线、辅对角线,-1起标示作用在矩阵中表示放皇后的位置
col[j]=-1;
M[i-j+Qnum-1]=-1;
S[i+j]=-1;
matrix[i][j]=-1;
if(i<Qnum-1)Find(i+1);
else{
cout<<"No."<<++count<<" result:"<<endl;
for(int iL=0;iL<Qnum;++iL){
for(int jC=0;jC<Qnum;++jC)
cout<<matrix[iL][jC]<<'\t';
cout<<endl;
}
cout<<endl;
}
col[j]=0;
M[i-j+Qnum-1]=0;
S[i+j]=0;
matrix[i][j]=0;
}
}
}
int main(){
cout<<"Input the num of queen:"<<endl;//暂时只处理4、8皇后
int num;
cin>>num;
Queen obj(num);
obj.FindPos();
return 0;
}
相关文章推荐
- C++递归问题之三---0-1背包问题:给定两个值value和num,在1到num之间取值使这些数和为value,输出所有组合
- 问题:求两个字符串的最长公共子串。 要求:输入两个字符串,输出它们的最长公共子串,包括长度。 设计: 设计一个类 String,包括一个 len(字符串长度)和字符串指针 s。另有如下成员函数: ·
- java 打印输出九九乘法表.要求:只能使用一个while,不能使用for循环、递归。
- xml解析2:使用递归解析给定的任意一个xml文档并且将其内容输出到命令行上
- 题目:输入一个已经按升序排序过的数组和一个数字, 在数组中查找两个数,使得它们的和正好是输入的那个数字。 要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。 例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,
- 二、给定一个 n 行 m 列的地牢,其中 '.' 表示可以通行的位置,'X' 表示不可通行的障碍,牛牛从 (x0 , y0 ) 位置出发,遍历这个地牢,和一般的游戏所不同的是,他每一步只能按照一些指定的步长遍历地牢,要求每一步都不可以超过地牢的边界,也不能到达障碍上。地牢的出口可能在任意某个可以通行的位置上。牛牛想知道最坏情况下,他需要多少步才可以离开这个地牢。
- 今有7对数字:两个1,两个2,两个3,...两个7,把它们排成一行。 要求,两个1间有1个其它数字,两个2间有2个其它数字,以此类推,两个7之间有7个其它数字。如下就是一个符合要求的排列:
- 最大堆---实现一个简化的搜索提示系统。给定一个包含了用户query的日志文件,对于输入的任意一个字符串s,输出以s为前缀的在日志中出现频率最高的前10条query。
- C++第六周任务5:解决用一个项目多个文件的方式实现,其中两个类的声明放在一个.h文件中,每个类的成员函数分别放一个文件,main()函数用一个文件。体会这样安排的优点。
- 【数据结构】对一个数组按给定的下标排序,仅使用两两交换的方式,要求不能对数组进行扩容尽可能使用额外少的空间
- 在主函数内任意输入一个5X6矩阵,编写一函数求出每一行的和放到一个一维数组中,输出此矩阵及其每一行的和。
- 递归:从尾到头输出链表& 从尾到头输出一个字符串 & 定义一个函数求字符串的长度,要求该函数体内不能声明任何变量
- 面试题之java 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 要求不能出现截半的情况
- 已知两个链表head1 和head2 各自有序,请把它们合并成一个链表依然有序,要求用递归方法进行。
- 问题描述如下: 有2.5亿个整数(这2.5亿个整数存储在一个数组里面,至于数组是放在外存还是内存,没有进一步具体说明); 要求找出这2.5亿个数字里面,不重复的数字的个数; 另外,可用的内存限定为600M; 要求算法尽量高效,最优;
- 将[1,n^2]区间内n^2个数字分别填充到n*n的矩阵里,要求任意两个相邻的数字的和,它们的最大值最小是多少?
- C++[算法]给定一个具有100个元素的数组,请对该数组随机赋值1-100,不能出现重复的值
- 已知两个链表head1 和head2 各自有序,请把它们合并成一个链表依然有序,要求用递归方法进行。
- 多态&指针访问虚函数&不能被继承的类&快速排序&N皇后问题&插入排序&堆排序&merge归并排序&栈上生成对象&两个栈实现一个队列
- 给定n个正整数,找出它们中出现次数最多的数。如果这样的数有多个,请输出其中最小的一个。