欢迎来到冰点文库! | 帮助中心 分享价值,成长自我!
冰点文库
全部分类
  • 临时分类>
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • ImageVerifierCode 换一换
    首页 冰点文库 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

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

    • 资源ID:2898146       资源大小:20.43KB        全文页数:8页
    • 资源格式: DOCX        下载积分:3金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要3金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    数据结构课程设计马的满覆盖.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();/输出棋盘调试结果:总结:本题目的设计历经多次曲折,但是最终由于时间紧迫,各种实现上的小细节没有去美化。使得程序看起来不是十分明了,界面没有什么美观可言,算是比较失败。主要原因是由于初始没有考虑蹩腿的问题,导致用错了思路,最后不得不重新整理思路寻找新的方法;教训:要纵观大局,不能忽视一些重要的细节,要考虑全面后再着手,大方向不能有一点的偏差!


    注意事项

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

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2023 冰点文库 网站版权所有

    经营许可证编号:鄂ICP备19020893号-2


    收起
    展开