程序的设计展示棋盘上奥秘1-.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
程序的设计展示棋盘上奥秘1-

程序设计展示棋盘上的奥秘(1) 从高斯八后到矩阵最优搜索 计算机学院 杨克昌 0 引言 1 高斯皇后问题 1.1 高斯八皇后问题 1.2 n皇后问题 1.3 n皇后问题求解的图形显示 2 皇后全控棋盘问题 2.1 r个皇后全控n×n棋盘 2.2 回溯求解r个皇后控制n×n棋盘问题 2.3 r个皇后全控n×m棋盘 3 矩阵最优搜索 3.1 矩阵的最大子圈 3.2 矩阵中的最小路径 3.3 迷宫探索 4 简要概括 引言 1. 常见棋盘 (1)围棋盘(19*19个点) 第13届农心杯世界围棋团体锦标赛第14局(决赛)?谢赫李昌镐棋谱 1996年2月10日至2月17日,国际象棋世界冠军卡斯帕罗夫与IBM开发的“深蓝”计算机对奕。经过艰苦的努力,并施出诱招,卡斯帕罗夫才最终在六盘的对奕中取得四比二的胜绩。1997年IBM的超级计算机深蓝以3.5:2.5的成绩战胜国际象棋冠军卡斯帕罗夫现在的电脑棋手可每秒搜索300万层棋,甚至可实现每秒算出10亿棋局,比过去电脑搜索快1000倍。这样的电脑棋手能搜索到14~15步棋,它的奕棋能力等级分可达3400分。n行×m列(点、格)的广义棋盘。 当n=m时,为方阵棋盘。如以上的围棋、五子棋、国际象棋都是方阵棋盘。 当n≠m时,为矩阵棋盘。如以上的中国象棋是矩阵棋盘。 探讨棋艺是谢赫、候逸凡等棋坛巨星们的事。本讲座将引导同学们审视与欣赏在棋盘这一方天地发生的一些有趣的故事与精彩,并从程序设计的视角探讨棋盘这一平台上的新奇与奥秘。 1 高斯皇后问题 著名的高斯八皇后问题是借助国际象棋高度抽象出来的一个形象有趣的组合数学问题,实际上是一个有着特殊要求的排列设计。 本节从高斯八皇后问题的枚举求解入手,综合应用回溯或递归求解一般的n皇后问题,进而探讨皇后控问题 高斯认为有76。1854年在柏林的象棋杂志上不同的作者发表了40不同的解高斯后问题 3. 枚举求解八皇后问题 (1) 设置枚举循环 设置枚举a循环,注意到解的范围应为区间87654321]。而数字1~8的任意一个排列的数字和为9的倍数,即数字1~8的任意一个排列均为9的倍数,因而枚举循环的枚举范围定为,其循环步长可优化为9。 (2) 任两个皇后不允许处在同一横排,同一纵列 要求8位数中数字1~8各出现一次,不能重复。 设置f数组,分离a的8个数字,用f(x)统计a中数字x的个数。若f(1)~f(8)均等于1,即数字1~8在a中各出现1次。否则返回。 (3) 任两个皇后不允许处在同一斜线上 设置g数组,若a的第k个数字为x,则g(k)=x。要求解的8位数的第j个数字与第k个数字的绝对值不等于j-k(设置j>k)。若出现 |g(j)-g(k)|=j-k 表明j与k出现同处在与棋盘边框成45°角的斜线上,则返回。 (4) 输出解 在枚举范围内同时通过以上(2)(3)两道筛选的8位数即为一个解,打印输出(每行打印6个解),同时用变量s统计解的个数。 4. 枚举求解后问题// 枚举求解高斯后问题 #include stdio.h #include math.h void main() {int s,k,i,j,t,x,f[9],g[9]; long a,y; s=0; printf( 高斯八皇后问题的解为:\n); for(aaa=a+9) // 步长为9枚举位数 {y=a;k=0; for(i=1;i=8;i++) f[i]=0; for(k=1;k=8;k++) { x=y%10;f[x]++; } for(t=0,i=1;i=8;i++) if(f[i]!=1) {t=1;break;} // 数字--8出现次 if(t==1) continue; for(k=1;k=7;k++) // 同处在45度角的斜线上 for(j=k+1;j=8;j++) if(abs(g[j]-g[k])==j-k) {t=1;k=7;break;} if(t==1) continue; s++; // 输出后问题的解 printf(%ld ,a); if(s%6==0) printf(\n); } printf(\n %d个解。\n,s); } 5. 程序运行与说明 运行程序,得 1683742

文档评论(0)

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

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档