去图书馆找找有关 数据结构 或是 算法设计 的书,一般都有8皇后的源代码
8皇后算法是算法的经典了 我记得我当年C语言程序上机就有这道题目 我直接按书上抄上去的 找不到的话就去网上下 网上下的一般会有很多错误 但一般是小错误 反复改下错就可以了
脑中想想一个正方形棋盘,这样容易理解
整个程序是按行为单位放皇后,放完第一行,再放第二行。并且将第i行放的位置记在对应的position[i]中,这个位置对应棋盘上的列,
所以,当放第n行时,如果position[i] == position[n],说明第n行和第i行放在了同一列,即该列已经有皇后了,所以不能放
abs(position[i]-position[n])代表第n列和第i列的距离,n-i代表第n行和第i行的距离,如果两点之间的行距=列距,则必定在棋盘的对角线上,也不能放皇后
#include <iostream>
#include <iomanip>
#include <cstdlib>
using namespace std;
int a[8][8];
int b[8][8];
int p[2][8];
void seta(int x,int y,int positive)
{
int i,j;
if(positive)
{
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
if(x==j||y==i||(x-j==y-i)||(x-j==i-y))
a[i][j]++;
}
}
}
else
{
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
if(x==j||y==i||(x-j==y-i)||(x-j==i-y))
a[i][j]--;
}
}
}
}
void setb(int i)
{
int j;
for(j=0;j<8;j++)
{
if(!a[i][j])
b[i][j]=1;
}
}
int search(int i)
{
int j,t=0;
for(j=0;j<8;j++)
{
if(b[i][j])
t++;
}
return (t);
}
int trial(int i,int j)
{
if(b[i][j])
{
seta(j,i,1);
b[i][j]=0;
p[0][i]=j;
p[1][i]=i;
return (1);
}
else return (0);
}
void printab()
{
int i,j;
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
cout << setw(2) << a[i][j];
cout << " ";
for(j=0;j<8;j++)
cout << setw(2) << b[i][j];
cout << endl;
}
}
void result(int y)
{
int i,j;
for(i=0;i<2;i++)
{
for(j=0;j<8;j++)
cout << " " << p[i][j]+1;
cout << endl;
}
cout << endl;
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
if(j==p[0][i])
cout << " X";
else
cout << " O";
}
cout << endl;
}
cout << endl;
}
int sumb()
{
int i,j,s=0;
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
s=s+b[i][j];
}
return (s);
}
void main()
{
int i,j,x,y;
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
a[i][j]=0;
b[i][j]=0;
}
}
for(i=0;i<=8;i++)
cout << setw(2) << i;
cout << " x" << endl;
for(j=1;j<=8;j++)
cout << setw(2) << j << " O O O O O O O O" << endl;
cout << " y";
cout << endl;
cout << "Please choose position for the first qween:" << endl;
cout << "x=";
cin >> x;
cout << "y=";
cin >> y;
x--,y--;
p[0][y]=x;
p[1][y]=y;
seta(x,y,1);
/ printab();
cout << endl;
system ("pause");/
for(i=1;i<8;)
{
setb((i+y)%8);
L: if(search((i+y)%8))
{
for(j=0;j<8;j++)
{
if(trial((i+y)%8,j))
{
i++;
break;
}
}
/ printab();
cout << i << " " << j+1;
cout << endl;
system ("pause");/
}
else
{
i--;
if(!i)
break;
seta(p[0][(i+y)%8],(i+y)%8,0);
/ printab();
cout << i << " " << j+1;
cout << endl;
system ("pause");/
goto L;
}
}
if(i)
{
result(y);
}
// system ("pause");
if(sumb())
{
i--;
seta(p[0][i],i,0);
/ printab();
cout << i << " " << j+1;
cout << endl;
system ("pause");/
goto L;
}
system ("pause");
}
如你所愿,8个for循环
#include<stdioh>
void main()
{
int i1,i2,i3,i4,i5,i6,i7,i8;
int j1,j2,j3,j4,j5,j6,j7,j8;
int a[8][8]={0};
int pk1,pk2,pk3,pk4,pk5,pk6,pk7,pk8;
int nk1,nk2,nk3,nk4,nk5,nk6,nk7,nk8;
int tj=0;
for(i1=0,j1=0;j1<8;j1++)
{
a[i1][j1]=1;
pk1=i1+j1;
nk1=i1-j1;
for(i2=1,j2=0;j2<8;j2++)
{
pk2=i2+j2;
nk2=i2-j2;
if(j2==j1||pk2==pk1||nk2==nk1)
continue;
else
a[i2][j2]=1;
for(i3=2,j3=0;j3<8;j3++)
{
pk3=i3+j3;
nk3=i3-j3;
if(j3==j2||j3==j1||pk3==pk2||pk3==pk1||nk3==nk2||nk3==nk1)
continue;
else
{
a[i3][j3]=1;
for(i4=3,j4=0;j4<8;j4++)
{
pk4=i4+j4;
nk4=i4-j4;
if(j4==j3||j4==j2||j4==j1||pk4==pk3||pk4==pk2||pk4==pk1||nk4==nk3||nk4==nk2||nk4==nk1)
continue;
else
{
a[i4][j4]=1;
for(i5=4,j5=0;j5<8;j5++)
{
pk5=i5+j5;
nk5=i5-j5;
if(j5==j4||j5==j3||j5==j2||j5==j1||pk5==pk4||pk5==pk3||pk5==pk2||pk5==pk1||nk5==nk4||nk5==nk3||nk5==nk2||nk5==nk1)
continue;
else
{
a[i5][j5]=1;
for(i6=5,j6=0;j6<8;j6++)
{
pk6=i6+j6;
nk6=i6-j6;
if(j6==j5||j6==j4||j6==j3||j6==j2||j6==j1||pk6==pk5||pk6==pk4||pk6==pk3||pk6==pk2||pk6==pk1||nk6==nk5||nk6==nk4||nk6==nk3||nk6==nk2||nk6==nk1)
continue;
else
{
a[i6][j6]=1;
for(i7=6,j7=0;j7<8;j7++)
{
pk7=i7+j7;
nk7=i7-j7;
if(j7==j6||j7==j5||j7==j4||j7==j3||j7==j2||j7==j1||pk7==pk6||pk7==pk5||pk7==pk4||pk7==pk3||pk7==pk2||pk7==pk1||nk7==nk6||nk7==nk5||nk7==nk4||nk7==nk3||nk7==nk2||nk7==nk1)
continue;
else
{
a[i7][j7]=1;
for(i8=7,j8=0;j8<8;j8++)
{
pk8=i8+j8;
nk8=i8-j8;
if(j8==j7||j8==j6||j8==j5||j8==j4||j8==j3||j8==j2||j8==j1||pk8==pk7||pk8==pk6||pk8==pk5||pk8==pk4||pk8==pk3||pk8==pk2||pk8==pk1||nk8==nk7||nk8==nk6||nk8==nk5||nk8==nk4||nk8==nk3||nk8==nk2||nk8==nk1)
continue;
else
{
a[i8][j8]=1;
tj+=1;
printf("%d %d %d %d %d %d %d %d 第%d种\n",j1,j2,j3,j4,j5,j6,j7,j8,tj);
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
以上就是关于数据结构 八皇后全部的内容,包括:数据结构 八皇后、c++八皇后问题、用c++编写一个程序求解八皇后问题.等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)