八皇后问题python 八皇后问题python遗传算法

2025-04-06 10:21

八皇后问题的数据结构课程设计

#include

八皇后问题python 八皇后问题python遗传算法八皇后问题python 八皇后问题python遗传算法


八皇后问题python 八皇后问题python遗传算法


int m=0,n; //m为摆法计数,n为皇后个数

int a;

int fit(int i, int j) //检查(i,j)上能否放棋子

{int j1=j, i1=i, ok1=1; //检查第i行上能否放棋子

while( (j1>1)&&ok1)

{j1--;

ok1=a[j1]!=i ;

}j1=j; i1=i; //检查对角线上能否放棋子

while( (j1>1)&&(i1>1)&&ok1)

{j1--;

i1--;

ok1=a[jint main(int argc, char argv[])1]!=i1 ;

}j1=j; i1=i; //检查另一对角线上能否放棋子

while( (j1>1)&&(i1

{j1--;

i1++;

ok1=a[j1]!=i1 ;

}return ok1;

}void queen(int j) //从第j列开始逐个试探

{if (j>n)

{m++;

printf("放法%d ",m);

label[m][j]=num;for (int i=1;i<=n;i++)

printf(" (%d,%d)",a[i],i);

printf("n");

}else for( int i=1; i<=n;i++)

if(fit(i,j)) //检查(i,j)上能否放棋子

{a[j]=i; //在(i,j)上放一个棋子

queen(j+1) ;

}}

void main()

{printf("请输入皇后棋子的个数n:n");

scanf("%d",&n); //n为皇后个数

a = new int[n];

queen(1);

}

表示一个算法常用的方法有哪四种

printf("(%d,%d)n",i,j);

表示一个算法常用的方法有分治法、动态规划、贪心法和回溯法。

一、分治法

定义:分治法是一种将问题分解成若干个子问题然后逐个解决的方法。每个子问题的解合并起来,最终得到原问题的解。步骤:分解:将原问题分解为若干个规模较小的子问题。解决:递归地求解各个子问题。合并:将各个子问题的解合并成原问题的解。

二、动态规划

定义:动态规划是通过将问题分解为相互重叠的子问题来求解的一种方法。它保存子问题的解,避免重复计算,以提高效率。

步骤:确定状态:确定问题可以通过哪些状态来描述。定义状态转移方程:找到问题的递推关系,即当前状态与之前某些状态之间的关系。确定边界条件:确定初始状态的值或边界情况下的解。计算顺序:按照一定的顺序计算各个子问题的解。

三、贪心法

定义:贪心法是一种通过每一步选择当前解,以期望获得全局解的方法。它不考虑未来的情况,只关注眼前能够得到的解。

步骤:选择贪心策略:根据问题的特性和约束条件,选择每一步的解。判断可行性:验证所选择的解是否满足问题的约束条件。更新解空间:更新问题的解空间,继续进行下一步的选择。

四、回溯法

定义:回溯法是一种通过尝试所有可能的解,并在搜索过程中剪枝来求解问题的方法。它适用于各种组合、排列、子集等类型的问题。步骤:选择路径:从初始状态开始,选择一个合适的路径,进入下一层状态。探索路径:在当前状态下,沿着路径向前探索并搜索#include 所有可能的解。

结果判断:判断当前路径是否为有效解,如果是则记录,如果不是则返回上一层状态并继续探索其他路径。剪枝作:根据问题的特点,在搜索过程中剪除不符合要求的路径,减少搜索空间。

拓展知识:

分治法:在排序算法(如归并排序和快速排序)中常用分治法来提高效率,也广泛应用于各种图形处理问题。动态规划:动态规划算法被广泛应用于最短路径问题、背包问题、序列比对等领域。贪心法:贪心法常用于任务调度、图的遍历、覆盖等问题。回溯法:回溯法常用于搜索问题,如八皇后问题、数独等。

八皇后对角线问题,这句话没看懂……

92 states ailable!

“对角线有两个方向”,他的意思是斜线方向。

if(abs(i-m)==abs(j-n) && label[i][j]==num)

象棋是88 = 64个格子,横着编号abcde。。。。纵向编号123456.。。。。。。

故任意格子都有一个的编号例如e3.

你可以把它翻译成坐标(5,3)。如果此格子站着皇后,5+3 = 8,5-3 = 2.

则(4,4)(3,5)等格子和(6,4)(7,5)等格子都不能再站皇后了。这些格子的flag将设为不能站皇后。

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

(1)全排列

将自然数1~n进行排列,共形成n!中排列方式,叫做全排列。

例如3的全排列是:1/2/3、1/3/2、2/1/3、2/3/1、3/1/2、3/2/1,共3!=6种。

(2)8皇后(或者n皇后)

保证8个皇后不能互相攻击,即保证每一横行、每一竖行、每一斜行最多一个皇后。

我们撇开第三个条件,如果每一横行、每一竖行都只有一个皇后。

将88棋盘标上坐标。我们讨论其中的一种解法:

- - - - - - - Q

- - - Q - - - -

Q - - - - - - -

- - Q - - - - -

- Q - - - - - -

- - - - - - Q -

- - - - Q - - -

如果用坐标表示就是:(1,8) (2,4) (3,1) (4,3) (5,6) (6,2) (7,7) (8,5)

将横坐标按次序排列,纵坐标就是8/4/1/3/6/2/7/5。这就是1~8的一个全排列。

我们将1~8的全排列存入输入a[]中(a[0]~a[7]),然后8个皇后的坐标就是(i+1,a[i]),其中i为0~7。

这样就能保证任意两个不会同一行、同一列了。

置于斜行,你知道的,两个点之间连线的斜率为1或者-1即为同一斜行,充要条件是|x1-x2|=|y1-y2|(两个点的坐标为(x1,y1)(x2,y2))。我们在输出的时候进行判断,任意两个点如果满足上述等式,则判为失败,不输出。

下面附上代码:添加必要的注释,其中全排列的实现看看注释应该可以看懂:

#include

#include

#include

#include

int printed;

//该函数用于画图,这里为了节约空间则略去

//读者只需要将draw(a,k);去掉注释即可画图

void draw(int a,int k)

{int i,j;

for(i=0;i

{printf("t");

for(j=0;j

//有皇后输出Q,否则输出-

if(a[i]-1==j) printf("Q "); else printf("- ");

printf("

");

}printf("

");

}//递归实现全排列,a是数组,iStep是位置的测试点,k是皇后的个数,一般等于8

void Settle(int a,int iStep,int k)

{int i,j,l,flag=1;

//如果iStep的数字等于a之前的数字,则存在重复,返回

for(i=0;i

if(a[iStep-1]==a[i]) return;

//如果iStep==k,即递归结束到一位,可以验证是否斜行满足

if(iStep==k)

{//双重循环判断是否斜行满足

for(j=0;j

for(l=0;l

//如果不满足,则flag=0

if(fabs(j-l)==fabs(a[j]-a[l])) flag=0;

//如果flag==1,则通过了斜行的所有测试,输出。

{for(i=0;i

printf("(%d,%d) ",i+1,a[i]);

printf("

");

//如果去掉这里的注释可以获得画图,由于空间不够,这里略去

// draw(a,k);

//printed变量计算有多printf("%dn",num);少满足题意的结果,是全局变量

printed++;

}flag=1;

}//如果未测试至末尾,则测试下一位(递归)

for(i=1;i<=k;i++)

{a[iStep]=i;

Settle(a,iStep+1,k);

}}

void main()

{int a;

int k;

//输入维数,建立数组

printf("Enter the size of the square:");

scanf("%d",&k);

a=(int)calloc(k,sizeof(int));

//清屏,从iStep=0处进入递归

("cls");

Settle(a,0,k);

//判断是否有结果

if(! printed) printf("No answers accepted!

");

else printf("%d states ailable!

",printed);

}附输出结果(输入k=8):

(1,1) (2,5) (3,8) (4,6) (5,3) (6,7) (7,2) (8,4)

(1,1) (2,6) (3,8) (4,3) (5,7) (6,4) (7,2) (8,5)

(1,1) (2,7) (3,4) (4,6) (5,8) (6,2) (7,5) (8,3)

(1,1) (2,7) (3,5) (4,8) (5,2) (6,4) (7,6) (8,3)

(1,2) (2,4) (3,6) (4,8) (5,3) (6,1) (7,7) (8,5)

(1,2) (2,5) (3,7) (4,1) (5,3) (6,8) (7,6) (8,4)

(1,2) (2,5) (3,7) (4,4) (5,1) (6,8) (7,6) (8,3)

(1,2) (2,6) (3,1) (4,7) (5,4) (6,8) (7,3) (8,5)

(1,2) (2,6) (3,8) (4,3) (5,1) (6,4) (7,7) (8,5)

(1,2) (2,7) (3,3) (4,6) (5,8) (6,5) (7,1) (8,4)

(1,2) (2,7) (3,5) (4,8) (5,1) (6,4) (7,6) (8,3)

(1,2) (2,8) (3,6) (4,1) (5,3) (6,5) (7,7) (8,4)

(1,3) (2,1) (3,7) (4,5) (5,8) (6,2) (7,4) (8,6)

(1,3) (2,5) (3,2) (4,8) (5,1) (6,7) (7,4) (8,6)

(1,3) (2,5) (3,2) (4,8) (5,6) (6,4) (7,7) (8,1)

(1,3) (2,5) (3,7) (4,1) (5,4) (6,2) (7,8) (8,6)

(1,3) (2,5) (3,8) (4,4) (5,1) (6,7) (7,2) (8,6)

(1,3) (2,6) (3,2) (4,5) (5,8) (6,1) (7,7) (8,4)

(1,3) (2,6) (3,2) (4,7) (5,1) (6,4) (7,8) (8,5)

(1,3) (2,6) (3,2) (4,7) (5,5) (6,1) (7,8) (8,4)

(1,3) (2,6) (3,4) (4,1) (5,8) (6,5) (7,7) (8,2)

(1,3) (2,6) (3,4) (4,2) (5,8)// }; (6,5) (7,7) (8,1)

(1,3) (2,6) (3,8) (4,1) (5,4) (6,7) (7,5) (8,2)

(1,3) (2,6) (3,8) (4,1) (5,5) (6,7) (7,2) (8,4)

(1,3) (2,6) (3,8) (4,2) (5,4) (6,1) (7,7) (8,5)

(1,3) (2,7) (3,2) (4,8) (5,5) (6,1) (7,4) (8,6)

(1,3) (2,7) (3,2) (4,8) (5,6) (6,4) (7,1) (8,5)

(1,3) (2,8) (3,4) (4,7) (5,1) (6,6) (7,2) (8,5)

(1,4) (2,1) (3,5) (4,8) (5,2) (6,7) (7,3) (8,6)

(1,4) (2,1) (3,5) (4,8) (5,6) (6,3) (7,7) (8,2)

(1,4) (2,2) (3,5) (4,8) (5,6) (6,1) (7,3) (8,7)

(1,4) (2,2) (3,7) (4,3) (5,6) (6,8) (7,1) (8,5)

(1,4) (2,2) (3,7) (4,3) (5,6) (6,8) (7,5) (8,1)

(1,4) (2,2) (3,7) (4,5) (5,1) (6,8) (7,6) (8,3)

(1,4) (2,2) (3,8) (4,5) (5,7) (6,1) (7,3) (8,6)

(1,4) (2,2) (3,8) (4,6) (5,1) (6,3) (7,5) (8,7)

(1,4) (2,6) (3,1) (4,5) (5,2) (6,8) (7,3) (8,7)

(1,4) (2,6) (3,8) (4,2) (5,7) (6,1) (7,3) (8,5)

(1,4) (2,6) (3,8) (4,3) (5,1) (6,7) (7,5) (8,2)

(1,4) (2,7) (3,1) (4,8) (5,5) (6,2) (7,6) (8,3)

(1,4) (2,7) (3,3) (4,8) (5,2) (6,5) (7,1) (8,6)

(1,4) (2,7) (3,5) (4,2) (5,6) (6,1) (7,3) (8,8)

(1,4) (2,7) (3,5) (4,3) (5,1) (6,6) (7,8) (8,2)

(1,4) (2,8) (3,1) (4,3) (5,6) (6,2) (7,7) (8,5)

(1,4) (2,8) (3,1) (4,5) (5,7) (6,2) (7,6) (8,3)

(1,4) (2,8) (3,5) (4,3) (5,1) (6,7) (7,2) (8,6)

(1,5) (2,1) (3,4) (4,6) (5,8) (6,2) (7,7) (8,3)

(1,5) (2,1) (3,8) (4,4) (5,2) (6,7) (7,3) (8,6)

(1,5) (2,1) (3,8) (4,6) (5,3) (6,7) (7,2) (8,4)

(1,5) (2,2) (3,4) (4,6) (5,8) (6,3) (7,1) (8,7)

(1,5) (2,2) (3,4) (4,7) (5,3) (6,8) (7,6) (8,1)

(1,5) (2,2) (3,6) (4,1) (5,7) (6,4) (7,8) (8,3)

(1,5) (2,2) (3,8) (4,1) (5,4) (6,7) (7,3) (8,6)

(1,5) (2,3) (3,1) (4,6) (5,8) (6,2) (7,4) (8,7)

(1,5) (2,3) (3,1) (4,7) (5,2) (6,8) (7,6) (8,4)

(1,5) (2,3) (3,8) (4,4) (5,7) (6,1) (7,6) (8,2)

(1,5) (2,7) (3,1) (4,3) (5,8) (6,6) (7,4) (8,2)

(1,5) (2,7) (3,1) (4,4) (5,2) (6,8) (7,6) (8,3)

(1,5) (2,7) (3,2) (4,4) (5,8) (6,1) (7,3) (8,6)

(1,5) (2,7) (3,2) (4,6) (5,3) (6,1) (7,4) (8,8)

(1,5) (2,7) (3,2) (4,6) (5,3) (6,1) (7,8) (8,4)

(1,5) (2,7) (3,4) (4,1) (5,3) (6,8) (7,6) (8,2)

(1,5) (2,8) (3,4) (4,1) (5,3) (6,6) (7,2) (8,7)

(1,5) (2,8) (3,4) (4,1) (5,7) (6,2) (7,6) (8,3)

(1,6) (2,1) (3,5) (4,2) (5,8) (6,3) (7,7) (8,4)

(1,6) (2,2) (3,7) (4,1) (5,3) (6,5) (7,8) (8,4)

(1,6) (2,2) (3,7) (4,1) (5,4) (6,8) (7,5) (8,3)

(1,6) (2,3) (3,1) (4,7) (5,5) (6,8) (7,2) (8,4)

(1,6) (2,3) (3,1) (4,8) (5,4) (6,2) (7,7) (8,5)

(1,6) (2,3) (3,1) (4,8) (5,5) (6,2) (7,4) (8,7)

(1,6) (2,3) (3,5) (4,7) (5,1) (6,4) (7,2) (8,8)

(1,6) (2,3) (3,5) (4,8) (5,1) (6,4) (7,2) (8,7)

(1,6) (2,3) (3,7) (4,2) (5,4) (6,8) (7,1) (8,5)

(1,6) (2,3) (3,7) (4,2) (5,8) (6,5) (7,1) (8,4)

(1,6) (2,3) (3,7) (4,4) (5,1) (6,8) (7,2) (8,5)

(1,6) (2,4) (3,1) (4,5) (5,8) (6,2) (7,7) (8,3)

(1,6) (2,4) (3,2) (4,8) (5,5) (6,7) (7,1) (8,3)

(1,6) (2,4) (3,7) (4,1) (5,3) (6,5) (7,2) (8,8)

(1,6) (2,4) (3,7) (4,1) (5,8) (6,2) (7,5) (8,3)

(1,6) (2,8) (3,2) (4,4) (5,1) (6,7) (7,5) (8,3)

(1,7) (2,1) (3,3) (4,8) (5,6) (6,4) (7,2) (8,5)

(1,7) (2,2) (3,4) (4,1) (5,8) (6,5) (7,3) (8,6)

(1,7) (2,2) (3,6) (4,3) (5,1) (6,4) (7,8) (8,5)

(1,7) (2,3) (3,1) (4,6) (5,8) (6,5) (7,2) (8,4)

(1,7) (2,3) (3,8) (4,2) (5,5) (6,1) (7,6) (8,4)

(1,7) (2,4) (3,2) (4,5) (5,8) (6,1) (7,3) (8,6)

(1,7) (2,4) (3,2) (4,8) (5,6) (6,1) (7,3) (8,5)

(1,7) (2,5) (3,3) (4,1) (5,6) (6,8) (7,2) (8,4)

(1,8) (2,2) (3,4) (4,1) (5,7) (6,5) (7,3) (8,6)

(1,8) (2,2) (3,5) (4,3) (5,1) (6,7) (7,4) (8,6)

(1,8) (2,3) (3,1) (4,6) (5,2) (6,5) (7,7) (8,4)

(1,8) (2,4) (3,1) (4,3) (5,6) (6,2) (7,7) (8,5)

求~~~pascal八皇后 非递归详细算法和程序

{if(label[c-1][i]==0)//存在可以放置第c个皇后的位置

Program queen;

var

a,b,c,d,e,f,g,h:1..8;

begin

for a:for c:= 1 to 8 do= 1 to 8 do

for b := 1 to 8 do

if a<>b then

if (a<>c) and (b<>c) then

for d:= 1 to 8 do

if ..... then

for ... := 1 to 8 do

if .... then

......

for h := 1 to 8 do

if (a<>h) and (b<>h)..... then

begin

if ..... then

write(...)

end;

条件懒得写了

1楼貌似递归....

建议:多用几个for吧

求八皇后问题C++程序设计

- - - - - Q - -

这样算是解

#include

class Queen8{

static int oktimes = 0;

static int chess[] = new int[QueenMax];

public static void main(String args[]){

for (int i=0;i

placequeen(0);

System.out.println("nnn八皇后共有"+oktimes+"个解法 made by yifi 2003");

}public static void placequeen(int num)

{int i=0;

boolean qse[] = new boolean[QueenMax];

for(;i

i=0;

while (i

qse[chess[i]]=false;

int k=num-i;

if ( (chess[i]+k >= 0) && (chess[i]+k < QueenMax) ) qse[chess[i]+k]=false;

if ( (chess[i]-k >= 0) && (chess[i]-k < QueenMax) ) qse[chess[i]-k]=false;

i++;

}for(i=0;i

if (qse[i]==false)continue;

if (num

chess[num]=i;

placequeen(num+1);

}else{ //num is last one

chess[num]=i;

System.out.println("这是第"+oktimes+"个解法 如下:");

System.out.println("第n行: 1 2 3 4 5 6 7 8");

for (i=0;i

String row="第"+(i+1)+"行: ";

else

for(int j=0;j

row+="++";

int j = chess[i];

while(j

System.out.println(row);

}}

}}

}

没想法了

课本上应该有吧

找本C++的书看看行了

用C语言编写三个算法,BFS或DFS,爬山算法,遗传算法实现八皇后问题

for (int j = 0; j < k; j ++)

百度算法名,加上if (chess[i]==0);八皇后

比如

BFS 八皇后问题 C语言。

或者

遗传算法 八皇后问题 C语言

然后根据搜索结果 就可以得到算法和代码了。

求公式的递归函数

//小于3x3的棋盘是无解的

//应该可以一个搞定

/

f(x,n)=x-x^}while(j

f(x,n-1)=x-x^2+x^3-x^4+···+(-1)^(n-2)x^(n-1)

(-x)f(x,n-1)=-x^2+x^3-x^4+……(-1)^(n-1)x^n=f(x,n)-x

f(x,n)=x-xf(x,n-1)

f(x,1)=x

/

#include "stdafx.h"

#include

#include

#include

long int fun(int,int);

{int a,b;

while(1)

{("cls");

printf("请输入x,n的值n");

scanf("%d %d",&a,&b);

if(a<=0||b<=0)

{exit(0);

}else

{printf("%dn",fun(a,b));

Sleep(1500);

}}

return 0;

}long int fun(int x,int n)

{static long int r=x;

if(n==1)

{r=x;

}else

{r=x-(xfun(x,n-1));

}return r;

}

f(x,n) {

if (n==-1) return 0;

else return (-1)^(n-1)x^n + f(x,n-1);

}

用C语言编写八皇后问题

#include "stdio.h"

#include "windows.h"

#define N 8 / 定义棋盘大小 /

int place(int k); / 确定某一位置皇后放置与否,放置则返回1,反之返回0 /

void backtrack(int i);/ 主递归函数,搜索解空间中第i层子树 /

void chesoard(); / 每找到一个解,打印当前棋盘状态 /

static int sum, /{Output(); 当前已找到解的个数 /

x[N]; / 记录皇后的位置,x[i]表示皇后i放在棋盘的第i行的第x[i]列 /

int main(void)

{backtrack(0);

("pause");

return 0;

}int place(int k)

{/ 测试皇后k在第k行第x[k]列时是否与前面已放置好的皇后相攻击。 x[j] == /

/ x[k] 时,两皇后在同一列上;abs(k - j) == abs(x[j] - x[k]) 时,两皇 /

/ 后在同一斜线上。两种情况两皇后都可相互攻击,故返回0表示不符合条件。/

if (abs(k - j) == abs(x[j] - x[k]) || (x[j] == x[k])) return 0;

return 1;

}void backtrack(int t)

{/ t == N 时,算法搜索至叶结点,得到一个新的N皇后互不攻击的放置方案 /

else

for (int i = 0; i < N; i ++) {

x[t] = i;

if (#include place(t)) backtrack(t + 1);

}}

void chesoard()

{printf("第%d种解法:n", ++ sum);

for (int i = 0; i < N; i ++) {

for (int j = 0; j < N; j ++)

if (j == x[i]) printf("@ ");

else printf(" ");

printf("n");

}printf("n");

}

这个题目用递归的方法呢,想楼上的那样。

我想知道八皇后问题的空间和时间复杂度,以及计算过程,谢谢

直接给你pascaif(flag)l的源程序。

program eightqueens;

var

x:array[1..8] of intgeer;

a,b,c:array[-7..16] of boolean;

q:boolean;

procedure print;

var

i:integer;

beginif(Queens == 8)/递归结束条件/

for i:=1 to 8 fo

write(x[i]:2);

inc(coint);

wrin('count=',count);

end;

procedure try(i:integer);

var

j:integer;

begin

for j:=1 to 8 do

begin

if a[j] and c[i-j] and b[i+j] then

begin

x[i]:=j;

a[j]:=false;

c[i-j]:=false;

b[i+j]:=false;

if i<8 then try (i+1)

else print;

a[j]:=true;

c[i-j]:=true'

b[i+j]:=true;

end; end;end;

begin

for i:=1 to 8 do

for i:=-7 to 7 do

c[i]:=true;

for i:=2 to 16 do

b[i]:=true;

count:=0;

try(1);

end.

时空复杂度没超过noip竞赛的要求。

下一篇:圈子文化和好人主义 圈子文化和好人主义整治方案
上一篇:
相关文章
返回顶部小火箭