数据结构课程设计报告--马儿覆盖问题.docVIP

数据结构课程设计报告--马儿覆盖问题.doc

  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文档。上传文档
查看更多
计算机与信息学院 数据结构 课程设计报告 专 业 班 级 计算机科学与技术07—4班 学生姓名及学号 邵贤军 课程教学班号 002班 任 课 教 师 胡学钢 张晶 实验指导教师 胡学钢 张晶 实验地点 寝室 2008 ~2009 学年第 二 学期 课程设计题目及要求: 一、课程设计题目及要求∶ 课题22. 在中国象棋棋盘上,如果在若干个马后,使得整个棋盘的任意空位置的棋子都能被这些马吃掉,则称这组放置为一个满覆盖,若去掉满覆盖中的任意一颗棋子都会使得这组放置不是满覆盖,则称这一覆盖为最小满覆盖,设计程序完成一下要求: 要求: (1) 求解一个极小满覆盖 (2) 最好能画出棋盘的图形形式,并在其上动态演示试探过程 (3) 程序能方便的移植到其他规格的棋盘上 二、实验环境和仪器设备∶ 计算机一台及Microsoft Visual C++6.0\Dev C++ 三、相关资料和参考文献(教材和实验指导书以外)∶ 网站论坛上的一些资料 四、课程设计思路: 该题的求解要用到深度搜索算法 用MFC对程序进行美化 总体思路:首先获得一张覆盖满棋子的棋盘,然后任取一个非最小满覆盖,对该非最小满覆盖进行处理。 具体过程: 1.获得一个非最小满覆盖 这一步要求不高,只需要随便找一个非最小满覆盖进行初始化即可。 2. 对棋盘进行处理。具体的函数见下: (1).Select(int x,int y,int count,NODE EatNum[])函数——对棋子进行处理 Count = —1; 对棋盘上的每一颗棋子进行处理,获得一个棋子数据,对棋子处理的方法是这样的,首先选定一颗要处理的棋子,然后对八个方向的棋子进行判断,得到一个数组EatNum[],该数组存放的是能吃到所处理的棋子的棋子,每处理一个棋子,若该棋子可以吃到所处理的棋子,存入数组,并将count加1 如此处理下图所示的1,2,3,4,5,6,7,8八个位置的棋子。 比如若1号位置有棋子且C位置没有棋子,则将1号位棋子存放到EatNum[]里,count++; 该函数执行后即可获得处理位置的信息,以便以后对该点进行删除马的操作。 2.MoveHorse(int x, int y)函数——删除马 函数主要功能是对每一个马进行处理,这里要用到Select(int x,int y,int count,NODE EatNum[])函数,由它处理后的数据对MoveHorse(int x, int y)有很重要的作用,首先函数MoveHorse(int x, int y)判断count的值,这里分为三种情况进行讨论:1,当count==-1的时候,这时说明该点没有马能吃到,显然这点的马不能拿到,否则将出现空位不能被踏到的危险,此时对另一个数组DelHorse[][]进行赋值为false; 2.当count==0的时候,这时说明这一点的马可以拿掉,但是要注意能吃到这一点的马却不能被删除掉,这时要设该点的DelHorse[][]为false; 3.当count0的时候,这时说明有很多点都能吃到这一点,这时我们对不能拿掉的点进行分离,若存在能拿掉的点,则在EatNum[]删除这一点的信息,另外,设一bool型标识量mark,初始值为false,若存在为false的点,则mark为true,接下来若mark为真的话,说明存在一定可以吃到这一点的马,并且那个马还是一直存在的,这时我们只要对剩下的马做MoveHorse()的操作了,假如mark不为真,这时我们取数组顶的那一点作为吃到这一点的固定马,即将DelHorse[][]设为false,接下来寻找经过Movehorse()处理后还存在的马,若存在,则将标记的那一点的马设为true; 具体流程见下图 3.主函数对函数的调用: (1)初始化棋盘; (2)利用一个9 x 10的循环对棋盘处理,先调用Select()函数,然后调用MoveHorse()函数; (3)输出棋盘; 具体流程见下图: 五、实验结果(截图)∶ 程序开始时的主界面: 棋盘初始状态: 得到的最小覆盖: 六、相关核心代码 #includeiostream #includewindows.h #includestdlib.h using namespace std; #define col 9 #define lin 10 class NODE{ public: int x; int y; }; int Board[col][lin]; bool DelHorse[col][lin]; void Select(int i,int j,int count,NODE EatNum[8]

文档评论(0)

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

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

1亿VIP精品文档

相关文档