ImageVerifierCode 换一换
格式:DOCX , 页数:8 ,大小:20.43KB ,
资源ID:9879423      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/9879423.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数据结构课程设计马的满覆盖.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数据结构课程设计马的满覆盖.docx

1、数据结构课程设计马的满覆盖设计题目: 在9*10的中国象棋上,如果在放置若干马后,使得整个棋盘的任意空位置上所放置的棋子均能被这些马吃掉,则称这组放置为棋盘的一个满覆盖。若去掉满覆盖中的任意一个棋子都会使这组放置不再是满覆盖,则称这一满覆盖为极小满覆盖。设计程序完成如下要求: (1)求解一个极小满覆盖。 (2)最好能画出棋盘的图形形式,并在其上动态的演示试探过程。 (3)程序能方便的移植到其它规格的棋盘上。模型表示:把棋盘用一个字符型的10*9的二维数组来表示,有马、没马分别用不同的字符来表示这样就把抽象的棋盘给具体化来了。思路探索:1,用一个二维数组来记录当棋盘上放满马在不考虑蹩腿情况下各个

2、位置的马所受其他马的攻击次数,用快速排序的方法从小到大进行排序,然后进行拿马操作,就是把受攻击次数小的马从棋盘上拿掉。其能拿掉的条件有两个:一,没拿掉前这只马的受攻击次数要大于0。二,拿掉后在其攻击范围内的马的受攻击次数都要大于0。这样一次进行下去直到不能再拿,最终得到的就一个不考虑蹩腿情况下的极小满覆盖。但当考虑蹩腿情况时这种算法就行不通了,因为考虑蹩腿无论是在拿马前,拿马过程中携带还是在拿马后都会使原本的思路混乱。2.初始不做任何处理,从第一个位置开始放马,放马后此马会对棋盘上的其他位置上的马产生影响,再在这只马不能吃掉的位置上放马,以后考虑蹩腿问题依次往下放直到棋盘上最后一个位置被放上,

3、或剩余的空位都能被其他已放的马吃掉。失败原因:第i次放马可能会对第i-1次放的马产生影响因为一个马能蹩四个位置,可能就把唯一能到某一位置的马给瘪死这样就会使放一马而动了整个棋盘!不可,复杂度难以想象最终思路:由前面总结,最终确定2的改革方案:用一个二维数组attackmax_imax_j来存储在棋盘上全部都放上马时不考虑蹩腿的情况下各个位置上的马受其他马攻击的次数;用另一字符型的二维数组covermax_i max_j来表示该坐标下的马的状态:N表示该位置上的马既没有,也不能被已放的马吃掉,Y表示该位位置上的马能被已放的马吃掉,*表示该位置已放马。找出当前受攻击次数最高的,放到棋盘上,考虑蹩腿

4、后在对棋盘上其他马受攻击的情况做一次调整,同时调整cover数组中的字符,再找出受攻击次数最高的再放,就这样一次下去直到其盘上剩余的位置都能被已放的马吃掉为止。在程序中写了一个chess类其中的具体的数据成员和成员函数如下表所示:类型名称作用数据成员int attackmax_hmax_s记录被攻击的次数char covermax_hmax_s表示棋盘上个位置当前状态int max记录找出的攻击次数最高的次数int max_i ,max_j记录找出攻击次数最高的马的位置成员函数chess()构造函数初始化void get_attack()得到攻击次数数组void to_attack(int a

5、,int b)放置一个马都后得出受攻击次数的变化void get_horse()得到被攻击次数最多的马void get_cover()记录当前棋盘上状态void put_horse()放被攻击次数最高的马void print_out()最后输出所得结果程序部分代码及细节实现:程序部分代码及细节实现如下:chess:chess()/构造函数的实现 for(int i = 0; i max_s; i+) for(int j = 0; j max_s; j+) coverij=N;/棋盘初始状态都是没放马 attackij=0;/受攻击次数都为0 max_i=0;/受攻击最多的马坐标(0 ,0) m

6、ax_j=0;void chess:get_attack()/受攻击次数数组的实现 for(int i = 0; i max_h;i+) for(int j = 0; j =0 & j-2 = 0) attacki-1j-2+; /将当前位置的-1.-2方向的位置被吃次数加1; if(i-1 =0 & j+2 =0 & j-1 = 0) attacki-2j-1+; /将当前位置的-2.-1方向的位置被吃次数加1; if(i-2 =0&j+1 max_s) attacki-2j+1+; /将当前位置的-2.1方向的位置被吃次数加1; if(i+1= 0) attacki+1j-2+; /将当前

7、位置的1.-2方向的位置被吃次数加1; if(i+1max_h&j+2max_s ) attacki+1j+2+; /将当前位置的1.2方向的位置被吃次数加1; if(i+2=0 ) attacki+2j-1+; /将当前位置的2.-1方向的位置被吃次数加1; if(i+2max_h&j+1= 0 & attacka-1b != 0)/其蹩(a-1,b)位置上的马吃(a+1,b-1)和(a+1,b+1)上的马 if(a+1 = 0&covera+1b-1=N) attacka+1b-1-; if(a+1max_h & b+1 max_s&covera+1b+1=N) attacka+1b+1-

8、; if(a+1 = 0 & b-1 = 0&covera-1b-1=N) attacka-1b-1-; if(a-1 = 0 & b+1 max_s&covera-1b+1=N) attacka-1b+1-; if(b+1 max_h & attackab+1 != 0) if(a+1 = 0&covera+1b-1=N) attacka+1b-1-; if(a-1 = 0 & b-1= 0&covera-1b-1=N) attacka-1b-1-; if(b-1= 0 & attackab-1 != 0) if(a-1 = 0 & b+1 = 0 & b+1 max_s&covera+1b

9、+1=N) attacka+1b+1-; void chess:get_horse()/得到攻击次数最高的马的函数实现 max = attack00;/用 Max暂时储存被吃次数最多的位置上被吃次数,中间变量 for(int i = 0; i max_s; i+) for(int j = 0; j max) max = attackij; max_i = i; max_j = j; void chess:put_horse()/放马的实现 if(attackmax_imax_j = 0 ) /用数组AttackMax_iMax_j储存被吃几率最大位置上的被吃次数 covermax_imax_j

10、 = *;/在覆盖数组中标志此位置为已放马. attackmax_imax_j =0;/不能忘记将该位置也标记已放马。 if(max_i-1=0&max_j-2=0&covermax_imax_j-1!=*) covermax_i-1max_j-2=Y; attackmax_i-1max_j-2=0; if(max_i-1=0&max_j+2=0&max_j+1=0&max_j-10&covermax_i-1max_j!=*) covermax_i-1max_j+2=Y; attackmax_i-1max_j+2 = 0; if(max_i+10&covermax_imax_j-1!=*) c

11、overmax_i+1max_j-2=Y; attackmax_i+1max_j-2 = 0; if(max_i+1max_h & max_j+2max_s&covermax_imax_j+1!=*) covermax_i+1max_j+2=Y; attackmax_i+1max_j+2 = 0; if(max_i+20&covermax_i+1max_j!=*) covermax_i+2max_j-1=Y; attackmax_i+2max_j-1 = 0; if(max_i+2max_h&max_j+1max_s&covermax_i+1max_j!=*) covermax_i+2max_

12、j+1=Y; attackmax_i+2max_j+1 = 0; to_attack(max_i,max_j); void chess:get_cover()/得到最小覆盖函数的实现 while(1) do get_horse(); if(max!=0&covermax_imax_j!=N) return; while(covermax_imax_j!=N); put_horse(); void chess:print_out()/输出棋盘函数的实现 for(int i = 0; i max_s; i+) for(int j = 0; j max_s; j+) coutcoverij ; coutendl; /主函数的实现Void main()Chess c;/定义一个对象c.get_attack();/生成攻击表格 c.get_cover();/完成极小覆盖的求解 c.print_out();/输出棋盘调试结果:总结:本题目的设计历经多次曲折,但是最终由于时间紧迫,各种实现上的小细节没有去美化。使得程序看起来不是十分明了,界面没有什么美观可言,算是比较失败。主要原因是由于初始没有考虑蹩腿的问题,导致用错了思路,最后不得不重新整理思路寻找新的方法;教训:要纵观大局,不能忽视一些重要的细节,要考虑全面后再着手,大方向不能有一点的偏差!

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1