八阶皇后问题求解
求大能把下面的程序分析一下,为什么我的程序用vs2010只能打印出十二个八阶皇后,用vc6.0却打印出三十个 但是不是从第一个开始,程序那出毛病了,求指点!!!急呀!!
#include <iostream>
#include <iomanip>
using namespace std;
void setCondition(bool *m,int n);//对状态进行设置
void row(bool *r,int i,int j,int n); //判断该行是否可以放皇后
void xie(bool *r,int i,int j,int n);
void obxie(bool *r,int i,int j,int n);
void obRow(bool *r,int i,int j,int n);//清除上一组数据
void obDiagonal(bool *d,int i,int j,int n);//清除上一组数据
void diagonal(bool *d,int i,int j,int n);//判断此正反斜对角线是否可以放皇后
void solve(bool *r,bool *d,bool *o,int i,int j,int *t,int n);//进行皇后放置
void print(int *t,int n );//进行打印
int z=0;
int main()
{
int i,j,n;
cout<<"请输入皇后阶数!"<<endl;
cin>>n;
int *t=new int [n];
bool *r=new bool [n];
bool *d=new bool [2*n-1];
bool *o=new bool [2*n-1];
setCondition(r,n);
setCondition(d,2*n-1);
setCondition(o,2*n-1);
i=0; j=0;
solve(r,d,o,i,j,t,n);
delete []t;
delete []r;
delete []d;
delete []o;
return 0;
}
void xie(bool *d,int i,int j,int n)
{
d[j+i]= false;
}
void obxie(bool *d,int i,int j,int n)
{
d[j+i]= true;
}
void setCondition(bool *m,int n)
{
int i;
for (i=0;i<n;i++)
{
m[i]=true;
}
}
void row(bool *r,int i,int j,int n)
{
r[i]=false;
}
void obRow(bool *r,int i,int j,int n)
{
r[i]=true;
}
void diagonal(bool *d,int i,int j,int n)
{
d[i-j+n-1]= false;
}
void obDiagonal(bool *d,int i,int j,int n)
{
d[i-j+n-1]= true;
}
void print(int *t,int n )
{
int i,j;
for (i=0;i<n;i++)
{
for (j=0;j<n;j++)
{
if (i==t[j])
{
cout<<setw(3)<<'Q';
}
else cout<<setw(3)<<'+';
}
cout<<endl;
}
z++;
cout<<z<<endl;
}
void solve(bool *r,bool *d,bool *o,int i,int j,int *t,int n)
{
if(i==n&&j==0) exit(0);
if (j==n)
{
cout<<endl;
print(t,n);
obDiagonal(d,t[j-1],j-1,n);
obxie(o,t[j-1],j-1,n);
obRow(r,t[j-1],j-1,n);
solve(r,d,o,t[j-1]+1,j-1,t,n);
}
if (i==n)
{
obDiagonal(d,t[j-1],j-1,n);
obxie(o,t[j-1],j-1,n);
obRow(r,t[j-1],j-1,n);
solve(r,d,o,t[j-1]+1,j-1,t,n);
}
if (r[i]&&d[i-j+n-1]&&o[i+j])
{
t[j]=i;
diagonal(d,i,j,n);
xie(o,i,j,n);
row(r,i,j,n);
solve(r,d,o,0,j+1,t,n);
}
else
{
solve(r,d,o,i+1,j,t,n);
}
}