C++八皇后递归解法

#include <iostream>
using namespace std;
int line[8];
int answer=0;
void show() //当遍历完所有的行时,输出结果
{
int i=0,j=0;
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
if(line[i]==j)//line[i]表示第i行中Q放置的列位置
cout<<"Q";
else
cout<<"*";
}
cout<<endl;
}
answer++;
cout<<endl;
cout<<answer<<endl;
getchar();
}
bool judge(int n) //判断是否同列,同对角线上
{
int i=0;
for(i=0;i<n;i++)
{
if(line[n]==line[i])
return true;
if(line[n]-n==line[i]-i)
return true;
if(line[n]+n==line[i]+i)
return true;
}
return false;
}
void control(int n) //控制函数
{
int t=8;
for(line[n]=0;line[n]<t;line[n]++)
{
if(judge(n))//某一行放置的列
continue;
else
if(n!=7)
control(n+1);//n+1行摆放的
else
show();
}
}
int main()
{
control(0);
system("pause");
return 0;
}

在show函数里面有一个句getchar()可注释,注释后输出所有的92种结果

line数组是表示每一行皇后的位置

如line[i]表示第i行皇后的位置下表为line[i]的数值,若line[4]为7表示第四行皇后的位置下标为7



自己照此修改如下:


#include <iostream>
using namespace std;

class Queen8{
int n,num;
int q[100]; //q[i] 的值表示第i行皇后放在第几列
public:
Queen8() {
num=0;
for(int i=0; i<n; i++) q[i]=0;
}

void Qnum() {
cout<<"Please input the number of queens:"<<endl;
cin>>n;
}

bool place(int row) {
for(int i=0; i<row; i++)
{
if(q[row]==q[i] || q[row]-row==q[i]-i || q[row]+row==q[i]+i) //1.是否同列 2.是否同主对角线 3.是否次对角线
return true;
}
return false;
}

void display() {
cout<<"No."<<num<<endl;
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{if(q[i]==j)
cout<<"Q"<<" "; //第i行第j列放Q,其他位置放*
else cout<<"*"<<" ";
}
cout<<endl;
}
cout<<endl;
}

void final() {
cout<<"The "<<n<<" queens problem has "<<num<<" possible solutions."<<endl;
}
void queen(int row) {
for(q[row]=0; q[row]<n; q[row]++)
{
if(place(row))
continue;
else if(row==n-1)
{ //得到一种情况并显示出来
num++;
display();
}
else
queen(row+1); //递归
}
}

};

int main()
{
Queen8 a;
a.Qnum();
a.queen(0);
a.final();
return 0;
}

 



posted on 2013-03-24 15:15  張晓  阅读(4589)  评论(0编辑  收藏  举报

导航