八皇后92种解(不排除对称和旋转所得棋局)
一.穷举法
(1)不用递归(教材P282例12。3)
#include
int data[9],iCount;
bool check();
void out(void);
void main()
{
int i1,i2,i3,i4,i5,i6,i7,i8;
for(i1=1;i1<=8;i1++)
for(i2=1;i2<=8;i2++)
for(i3=1;i3<=8;i3++)
for(i4=1;i4<=8;i4++)
for(i5=1;i5<=8;i5++)
for(i6=1;i6<=8;i6++)
for(i7=1;i7<=8;i7++)
for(i8=1;i8<=8;i8++)
{
data[1]=i1;
data[2]=i2;
data[3]=i3;
data[4]=i4;
data[5]=i5;
data[6]=i6;
data[7]=i7;
data[8]=i8;
if(check())
out();
}
}
bool check()
{
int i,m;
for(m=1;m<9;m++)
for(i=1;i
int iCount;
int data[9];
bool check();
void out();
void queen(int r);
void main()
{
queen(8);
}
void queen(int r)
{
int i;
for(i=1;i<=8;i++)
{
data[8-r+1]=i;
if(r>1)
queen(r-1);
else
if(check())
out();
}
}
bool check()
{
int i,m;
for(m=1;m<9;m++)
for(i=1;i
int iCount;
int data[9],m;
bool check(int m);
void change(void);
void extend(void);
void out();
void main()
{
data[0]=0;
data[1]=1;
m=1;
while(m>0)
if(check(m))
{
if(m==8)
{
out();
change();
}
else
extend();
}
else
change();
}
void change(void)
{
while(data[m]==8)
m=m-1;
data[m]=data[m]+1;
}
void extend(void)
{
m=m+1;
data[m]=1;
}
bool check(int m)
{
int i;
for(i=1;i
int iCount;
int data[9];
bool check(int m);
void out();
void queen(int r);
void main()
{
queen(8);
}
void queen(int r)
{
int i;
for(i=1;i<=8;i++)
{
data[8-r+1]=i;
if(check(8-r+1))
if(r>1)
queen(r-1);
else
out();
}
}
bool check(int m)
{
int i;
for(i=1;i