残缺棋盘问题.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文档。上传文档
查看更多
残缺棋盘问题

残缺棋盘问题的VC++实现 问题分析 残缺棋盘(defective chessboard)是一个有2k×2k个方格的棋盘,其中恰有一个方格残缺。图1给出k≤2时各种可能的残缺棋盘,其中残缺的方格用阴影表示。注意当k=0时,仅存在一种可能的残缺棋盘(如图1a所示)。事实上,对于任意k,恰好存在22k种不同的残缺棋盘。 残缺棋盘的问题是:要求用三格板(triominoes)覆盖残缺棋盘(如图2所示)。在此覆盖中,两个三格板不能重叠,三格板不能覆盖残缺方格,但必须覆盖其他所有的方格。在这种限制条件下,所需要的三格板总数为(22k-1)/3。可以验证(22k-1)/3是一个整数。k为0的残缺棋盘很容易被覆盖,因为它没有非残缺的方格,用于覆盖的三格板的数目为0。当k=1时,正好存在3个非残缺的方格,并且这三个方格可用图2中的某一方向的三格板来覆盖。 用分而治之方法可以很好地解决残缺棋盘问题。这一方法可将覆盖2k×2k残缺棋盘的问题转化为覆盖较小残缺棋盘的问题。2k×2k棋盘一个很自然的划分方法就是将它划分为如图3a所示的4个2k-1×2k-1棋盘。注意到当完成这种划分后,4个小棋盘中仅仅有一个棋盘存在残缺方格。首先覆盖其中包含残缺方格的2k-1×2k-1残缺棋盘,然后把剩下的3个小棋盘转变为残缺棋盘,为此将一个三格板放在由这3个小棋盘形成的角上,如图3b所示,其中原2k×2k棋盘中的残缺方格落入左上角的2k-1×2k-1棋盘。可以采用这种分割技术递归地覆盖2k×2k残缺棋盘。当棋盘的大小减为1×1时,递归过程终止。此时1×1的棋盘中仅仅包含一个方格且此方格残缺,所以无需放置三格板。 图1 图2 图3 算法选择 用分而治之方法解决此问题,即为了解决一个大的问题,可以:1)把它分成两个或多个更小的问题;2)分别解决每个小问题;3)把各小问题的解答组合起来,即可得到原问题的解答。小问题通常与原问题相似,可以递归地使用分而治之策略来解决。选用递归算法,先构造一个函数,专门用与递归实现棋盘补充问题。入口参数分别为棋盘左上角点坐标,棋盘右下角点坐标,棋盘残缺点坐标。这三个参数与每次调用它们的棋盘的阶数有关。第一步,取棋盘中点,先判断残缺点的X,Y在哪一个区域,同时可覆盖三个小方格,即四个区域分别设定每一个区域的左上角,右下角和缺点.将它们分别存入一个数组中。棋盘划分一次,棋子增加3个,棋盘减少一个,同时又新增加4个棋盘。递归函数调用,直至所有的子棋盘都被覆盖。 方案设计 (1)功能部分 本程序的工作除了在View类中实现游戏的开始,暂停,停止外,主要是设计了残缺棋盘类CDefBoard。在残缺棋盘类CDefBoard中主要实现了:递归算法实现, 自动创建棋盘,自动创建缺点,棋盘绘制,缺点绘制等(手动创建棋盘部分只让k在1-4间取值,是为了既说明了问题,又可以达到界面美观的目的)。 (2)界面美化部分 本程序的界面美化部分主要包括: 启动登陆画面的添加; 工具条图标实现了真彩化,精心找得图标,尽量使其达到美观的目的。 4.编程实现 (1) 功能实现: 1) 残缺棋盘类CDefBoard 成员变量: (a) tricount变量表示三角板个数; (b) m_Size为边长属性,m_DefectR与m_DefectC为缺点的行值与列值。 (c) Apoint,Bpoint,Cpoint三个数组分别存储每块三角板的第一块、第二块、第三块的行列值。 成员函数: (a) SuanFa()函数是递归算法的具体体现; (b) AutoBoard()和AutoDefect()函数用于被视图类中自动生成棋盘函数的调用,实现对随机生成棋盘边长和缺点位置并先后画到视图区中。 (c) DrawDefect(CDC *pDC)和MyDraw(CDC *pDC)函数用于画缺点和棋盘; (d) Serialize(CArchive ar)实现棋盘的存储,即分别将Apoint,Bpoint,Cpoint三个数组串行储存于文件中,需要时再串行输出。 2) 视图类CDefChessBView 成员变量: (a) AddDefectFlag是否加缺点的标志位; (b) BoardFlag是否生成棋盘的标志位; (c) DefectFlag是否创建缺点的标志位; (d) StopFlag是否停止的标志位; (e) PauseFlag是否暂停的标志位; (f) StartFlag是否开始的标志位; (g) AutoFlag是否自动生成残缺棋盘的标志位。 成员函数: (a) OnAutocreat()函数用于响应用户指令“自动创建棋盘及缺点”; (b) OnCreatboard()函数用于响应“手动生成棋盘”; (c) OnCreatdefect()函数用于响应“手动创建缺点”; (d) On

文档评论(0)

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

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

1亿VIP精品文档

相关文档