数据结构 八皇后

数据结构 八皇后,第1张

去图书馆找找有关 数据结构 或是 算法设计 的书,一般都有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++编写一个程序求解八皇后问题.等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10209510.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存