关于八皇后问题

kuaidi.ping-jia.net  作者:佚名   更新日期:2024-08-04
关于八皇后问题,急需!

八皇后的c++语言解法:
#include
#include
#include
int n,k,a[20],num=0;
int attack(int k){
int flag=0;
int i=1;
while ((i<k)&&(a[k]!=a)&&(fabs(a[k]-a)!=(k-i))) i++;
if (i==k) flag=1;
return flag;
}
void place(int k)
{
//printf(" %d",k);
int i;
if (k==n+1){
num=num+1;
printf("num=%d:",num);
for (i=1;i<n+1;i++)
printf(" %d",a);
printf("
");}
else {
for (i=1;i<n+1;i++){
a[k]=i;
if (attack(k)==1) place(k+1);
else a[k]=0;
}
}
}
main(){
scanf("%d",&n);
k=1;
place(k);
if (k!=n+1) printf("no solution!
");
getch();
}

更多详细内容可以参看百度百科~~~

#include
#include
int pp=0;
int way[100];
print(int n){
int i,j,k;
pp++;
printf("

>>*---*>> 第%d图解 <<*---*<<
",pp);
printf("┌");
for(k=1;k<=n;k++)
printf("—┬");
printf("—┐
");
for (i=0;i<=n;i++)
{
printf("│");
for (j=0;j<=way[i]-1;j++)
printf(" │");
printf("⊙",way[i]+1);printf("│");
for (j=way[i];j<=n-1;j++)
printf(" │");
printf("
");
if(i<n)
{printf("├");
for(k=1;k<=n;k++)
printf("—┼");
printf("—┤
");}
if(i>n-1)
{printf("└");
for(k=1;k<=n;k++)
printf("—┴");
printf("—┘
");
}}}

ifput(int x,int y){
int i,put;
put=1;
for (i=0;i<=y;i++)
if(((abs(way[i]-x)==abs(i-y))&&(i!=y))||((way[i]==x)&&(y!=i)))
put=0;
return(put);
}

queen(int y,int n){
int x,put;
for(x=0;x<=n;x++){
put=ifput(x,y);
if(put==1){
way[y]=x;
if(y==n) print(n);
else queen(y+1,n);
}}}

main(){
int n;
printf("

N皇后问题实现");
printf("

Queen皇后数:");
scanf("%d",&n);
queen(0,n-1);
}

这是N皇后!不光你想要什么级别的皇后都可以!
而且改动了一下!变成什么样子你子运行一下!
酷极了!哈哈、、、祝你好运!

八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。
  对于八皇后问题的实现,如果结合动态的图形演示,则可以使算法的描述更形象、更生动,使教学能产生良好的效果。下面是用Turbo C实现的八皇后问题的图形程序,能够演示全部的92组解。八皇后问题动态图形的实现,主要应解决以下两个问题。
(1)回溯算法的实现
  (a)为解决这个问题,我们把棋盘的横坐标定为i,纵坐标定为j,i和j的取值范围是从1到8。当某个皇后占了位置(i,j)时,在这个位置的垂直方向、水平方向和斜线方向都不能再放其它皇后了。用语句实现,可定义如下三个整型数组:a[8],b[15],c[24]。其中:
a[j-1]=1 第j列上无皇后
a[j-1]=0 第j列上有皇后
b[i+j-2]=1 (i,j)的对角线(左上至右下)无皇后
b[i+j-2]=0 (i,j)的对角线(左上至右下)有皇后
c[i-j+7]=1 (i,j)的对角线(右上至左下)无皇后
c[i-j+7]=0 (i,j)的对角线(右上至左下)有皇后
  (b)为第i个皇后选择位置的算法如下:
for(j=1;j<=8;j++) /*第i个皇后在第j行*/
if ((i,j)位置为空)) /*即相应的三个数组的对应元素值为1*/
{占用位置(i,j) /*置相应的三个数组对应的元素值为0*/
if i<8
为i+1个皇后选择合适的位置;
else 输出一个解
}
(2)图形存取
  在Turbo C语言中,图形的存取可用如下标准函数实现:
size=imagesize(x1,y1,x2,y2) ;返回存储区域所需字节数。
arrow=malloc(size);建立指定大小的动态区域位图,并设定一指针arrow。
getimage(x1,y1,x2,y2,arrow);将指定区域位图存于一缓冲区。
putimage(x,y,arrow,copy)将位图置于屏幕上以(x,y)左上角的区域。
(3)程序清单如下
#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <dos.h>
char n[3]={'0','0'};/*用于记录第几组解*/
int a[8],b[15],c[24],i;
int h[8]={127,177,227,277,327,377,427,477};/*每个皇后的行坐标*/
int l[8]={252,217,182,147,112,77,42,7}; /*每个皇后的列坐标*/
void *arrow;
void try(int i)
{int j;<br/>for (j=1;j<=8;j++)<br/>if (a[j-1]+b[i+j-2]+c[i-j+7]==3) /*如果第i列第j行为空*/<br/>{a[j-1]=0;b[i+j-2]=0;c[i-j+7]=0;/*占用第i列第j行*/<br/>putimage(h[i-1],l[j-1],arrow,COPY_PUT);/*显示皇后图形*/<br/>delay(500);/*延时*/<br/>if(i<8) try(i+1);<br/>else /*输出一组解*/<br/>{n[1]++;if (n[1]>'9') {n[0]++;n[1]='0';}
bar(260,300,390,340);/*显示第n组解*/
outtextxy(275,300,n);
delay(3000);
}
a[j-1]=1;b[i+j-2]=1;c[i-j+7]=1;
putimage(h[i-1],l[j-1],arrow,XOR_PUT);/*消去皇后,继续寻找下一组解*/
delay(500);
}}
int main(void)
{int gdrive=DETECT,gmode,errorcode;<br/>unsigned int size;<br/>initgraph(&gdrive,&gmode,"");<br/>errorcode=graphresult();<br/>if (errorcode!=grOk)<br/>{printf("Graphics error\n");exit(1);}
rectangle(50,5,100,40);
rectangle(60,25,90,33);
/* 画皇冠 */
line(60,28,90,28);line(60,25,55,15);
line(55,15,68,25);line(68,25,68,10);
line(68,10,75,25);line(75,25,82,10);
line(82,10,82,25);line(82,25,95,15);
line(95,15,90,25);
size=imagesize(52,7,98,38); arrow=malloc(size);
getimage(52,7,98,38,arrow); /* 把皇冠保存到缓冲区 */
clearviewport();
settextstyle(TRIPLEX_FONT, HORIZ_DIR, 4);
setusercharsize(3, 1, 1, 1);
setfillstyle(1,4);
for (i=0;i<=7;i++) a=1;
for (i=0;i<=14;i++) b=1;
for (i=0;i<=23;i++) c=1;
for (i=0;i<=8;i++) line(125,i*35+5,525,i*35+5); /* 画棋盘 */
for (i=0;i<=8;i++) line(125+i*50,5,125+i*50,285);
try(1); /* 调用递归函数 */
delay(3000);
closegraph();
free(arrow);

八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。
  对于八皇后问题的实现,如果结合动态的图形演示,则可以使算法的描述更形象、更生动,使教学能产生良好的效果。下面是用Turbo C实现的八皇后问题的图形程序,能够演示全部的92组解。八皇后问题动态图形的实现,主要应解决以下两个问题。
(1)回溯算法的实现
  (a)为解决这个问题,我们把棋盘的横坐标定为i,纵坐标定为j,i和j的取值范围是从1到8。当某个皇后占了位置(i,j)时,在这个位置的垂直方向、水平方向和斜线方向都不能再放其它皇后了。用语句实现,可定义如下三个整型数组:a[8],b[15],c[24]。其中:
a[j-1]=1 第j列上无皇后
a[j-1]=0 第j列上有皇后
b[i+j-2]=1 (i,j)的对角线(左上至右下)无皇后
b[i+j-2]=0 (i,j)的对角线(左上至右下)有皇后
c[i-j+7]=1 (i,j)的对角线(右上至左下)无皇后
c[i-j+7]=0 (i,j)的对角线(右上至左下)有皇后
  (b)为第i个皇后选择位置的算法如下:
for(j=1;j<=8;j++) /*第i个皇后在第j行*/
if ((i,j)位置为空)) /*即相应的三个数组的对应元素值为1*/
{占用位置(i,j) /*置相应的三个数组对应的元素值为0*/
if i<8

八皇后问题是非常经典的问题,即在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
最早由数学王子高斯提出,但他未能给出完美的解答,因为这类问题不适合求解(不借助计算机)
主要做法有回溯法和构造法
尽管作为回溯法的经典题,但采用构造法效率更高(时间复杂度较低)

  • 关于八皇后问题
    答:八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40...
  • 八皇后问题高效解法
    答:在计算机科学中,八皇后问题是一个经典的回溯算法问题。其目标是在一个8x8的棋盘上放置8个皇后,使得任何两个皇后都不在同一行、同一列或同一对角线上。下面是一种高效的递归解法的实现,用Java编写。首先,创建一个名为Queen8的类,其中定义了一个静态变量QueenMax表示棋盘大小,为8。数组chess用于存储...
  • 什么叫八皇后问题
    答:八皇后问题:在8×8的国际象棋盘上,放置八个皇后,使任何一个皇后都不能吃掉另一个 国际象棋规则中,皇后可以吃到任何一个与他在同一行、同一列或者同一斜线上的敌方棋子,所以八皇后问题的所有解满足:8个皇后都不在同一行、同一列,或者同一斜线上;或者:任意行、列或者斜线上 有且仅有一个皇...
  • 什么是八皇后问题?
    答:1、冲突。包括行、列、两条对角线:(1)列:规定每一列放一个皇后,不会造成列上的冲突;(2)行:当第I行被某个皇后占领后,则同一行上的所有空格都不能再放皇后,要把以I为下标的标记置为被占领状态;(3)对角线:对角线有两个方向。在同一对角线上的所有点(设下标为(i,j)),要么(...
  • 八皇后问题独立解
    答:关于八皇后问题的求解方法,比如Pascal语言中的一种算法,它通过定义变量和函数来递归寻找解。首先,函数p1检查当前皇后的位置是否与之前放置的皇后冲突,如果冲突则返回false。函数p2用于计数独立解,当找到一个有效的解时,就会调用这个函数。函数p3则通过循环和递归尝试在每一行放置皇后,遵循p1的规则。最后...
  • 八皇后问题的介绍
    答:八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的...
  • 八皇后问题的问题概述
    答:八皇后问题的第一个解是在1850年由弗朗兹·诺克给出的。诺克也是首先将问题推广到更一般的n皇后摆放问题的人之一。1874年,S.冈德尔提出了一个通过行列式来求解的方法,这个方法后来又被J.W.L.格莱舍加以改进。艾兹格·迪杰斯特拉在1972年用这个问题为例来说明他所谓结构性编程的能力。八皇后问题出现在...
  • 如何用数学方法解决八皇后问题?
    答:首先,让我们聚焦于一个关键的递推公式,它在寻找解法中扮演着重要角色:inversef[j_] := (m = 2; While[j > Fibonacci[m], m = m + 1]; m); 这个公式就像一座桥梁,连接着棋盘上皇后数量与所需递推阶数。然而,这并非简单的一次性解决,而是随着棋盘大小的增长,阶数呈指数级上升,直到...
  • 八皇后问题拓展
    答:八皇后问题:在8×8的国际象棋盘上,放置八个皇后,使任何一个皇后都不能吃掉另一个国际象棋规则中,皇后可以吃到任何一个与他在同一行、同一列或者同一斜线上的敌方棋子,所以八皇后问题的所有解满足:8个皇后都不在同一行、同一列,或者同一斜线上;或者:任意行、列或者斜线上 有且仅有一个皇后...
  • 经典算法之八皇后问题
    答:当八皇后布局完成,代码会优雅地打印出每个皇后的位置,犹如棋盘上星星点点的璀璨。每个"☆"都代表一个聪明的决策,每一次"回溯"都是一种智慧的体现。通过八皇后问题,我们不仅解开了棋盘上的谜题,更深入理解了回溯算法的精髓。每一次的尝试、每一次的退步,都指向最终的答案。这就是经典算法的魅力,它...