八皇后问题的遗传算法解法,c语言编写

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了八皇后问题的遗传算法解法,c语言编写相关的知识,希望对你有一定的参考价值。

用遗传算法解决八皇后问题

#include <stdlib.h>
#include<math.h>
#include<conio.h>
#include<stdio.h>

int N=0;
int a[10][10];
int yp=1;
FILE * fp;
void main()

int *pa;
int m,n,f,aa;
int check(),reback();
int prt();
clrscr();
fp=fopen("data.dat","w");
printf("please input the number of queens(4--10):");
scanf("%d",&N);
for(m=0;m<N;m++)
for(n=0;n<N;n++)
a[m][n]=0;

m=0;n=0;aa=0;

dofor(n=0;n<N;n++)

f=check(m,n);
if(m==N-1 && f==1)a[m][n]=1; prt();f=0;a[m][n]=0;
if(f==1) a[m][n]=1; break;
if(n==N-1&&f==0)

do
m--;
n=reback(m);
if(m==0 && n==N-1 && aa==1) break;
while(n>=N-1);


aa=1;
m++;
if(m>=N)m=0;
while(m<N &&n<N);
printf("\\n\\n********IT\'S OVER!!********");
fprintf(fp,"\\n\\n**********IT\'S OVER!!*******");
close(fp);
getch();


int check(int x1,int y1)
int a1,b1;
for(a1=0;a1<x1;a1++)
for(b1=0;b1<N;b1++)
if(a[a1][b1]==1)
if(a1==x1||b1==y1) return(0);
if((a1-b1)==(x1-y1)) return(0);
if((a1+b1)==(x1+y1))return(0);




return(1);


int reback(int w)

int x;
for(x=0;x<N;x++)
if(a[w][x]==1)

a[w][x]=0;
return(x);



int prt()
int t,y;

clrscr();

printf("\\n************ %d **************\\n\\n",yp);
fprintf(fp,"\\n************ %d **************\\n\\n",yp);
yp++;
for(t=0;t<N;t++)
for(y=0;y<N;y++)
printf("%3d",a[t][y]);
fprintf(fp,"%3d",a[t][y]);

printf("\\n");
fprintf(fp,"\\n");



getch();

return(0);
参考技术A 靠,太长了

八皇后问题算法详解

参考技术A 八皇后问题,是一个古老而著名的问题,是 回溯算法 的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯 认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。

本文的主要描述的是基于回溯算法思想的求解算法,并尽可能在细节上给予读者直观展示,以使得读者可以有更好的理解。抛砖引玉,如有错误请不吝赐教。

算法的关键在于用一个二维数组chess [ ] [ ] 来记录每一个位置(第 i 行第 j 列)是否合法(行列对角线上没有填皇后,对应于数组 chess [ i ] [ j ] 为 0),用一个一维数Queenplace [ ] 组来记录每一行上皇后的列标(比如Queenplace [ row ] =column 表示第 row 行第 column 列填入皇后)。

行数 i 从第一行开始,遍历每一列 j ,如果chess [ i ] [ j ] 为0,那么说明此位置可以填入皇后,则将chess中与此位置同行同列同对角线的value自增 1 并且在 数组Queenplace 中记录相应的坐标。然后递归计算每一行直到最后一行成功填入皇后并在此时打印棋盘 。最后进行回溯,恢复chess [ ] [ ] ,将chess中与此位置同行同列同对角线的value自减 1 并继续进行下一列的计算。

以上是关于八皇后问题的遗传算法解法,c语言编写的主要内容,如果未能解决你的问题,请参考以下文章

八皇后问题

求教C语言回溯法写出八皇后问题的92种解

八皇后问题求解的C语言程序的实现

Python用迭代(yield)和递归解决八皇后问题

八皇后问题算法详解

八皇后究竟有多少种解法?怎么解?