运筹学经典问题-八皇后问题.docVIP

  1. 1、本文档共14页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
八皇后问题   八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯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 i8   为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;   for (j=1;j=8;j++)   if (a[j-1]+b[i+j-2]+c[i-j+7]==3) /*如果第i列第j行为空*/   {a[j-1]=0;b[i+j-2]=0;c[i-j+7]=0;/*占用第i列第j行*/   putimage(h[i-1],l[j-1],arrow,COPY_PUT);/*显示皇后图形*/   delay(500);/*延时*/   if(i8) try(i+1);   else /*输出一组解*/   {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;   unsigned int size;   initgraph(gdrive,gmode,);   errorcode=graphresult();   if (errorcode!=grOk)   {printf(Graphics error\n);exit(1);}   rectangle(50,5,100,40);   rectangle(

文档评论(0)

1243595614 + 关注
实名认证
文档贡献者

文档有任何问题,请私信留言,会第一时间解决。

版权声明书
用户编号:7043023136000000

1亿VIP精品文档

相关文档