中国象棋将帅问题.pdf

  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文档。上传文档
查看更多
写书评,赢取《编程之美——微软技术面试心得》/BCZM.asp 中国象棋将帅问题 1.2★★★ 下过中国象棋的朋友都知道,双方的“将”和“帅”相隔遥远,并且它们不能照面。在象棋 残局中,许多高手能利用这一规则走出精妙的杀招。假设棋盘上只有“将”和“帅”二子(如图 1-3 所示)(为了下面叙述方便,我们约定用A 表示“将”,B 表示“帅”): 图1-3 A 、B 二子被限制在己方3×3 的格子里运动。例如,在如上的表格里,A 被正方形{d10,f 10, d ,f }包围,而B 被正方形{d ,f , d ,f }包围。每一步,A 、B 分别可以横向或纵向移动一格, 8 8 3 3 1 1 但不能沿对角线移动。另外,A 不能面对B ,也就是说,A 和B 不能处于同一纵向直线上(比 如A 在d 的位置,那么B 就不能在d 、d 以及d )。 10 1 2 3 请写出一个程序,输出A 、B 所有合法位置。要求在代码中只能使用一个变量。 写书评,赢取《编程之美——微软技术面试心得》/BCZM.asp 分析与解法 问题的本身并不复杂,只要把所有A 、B 互相排斥的条件列举出来就可以完成本题的要 求。由于本题要求只能使用一个变量,所以必须首先想清楚在写代码的时候,有哪些信息需 要存储,并且尽量高效率地存储信息。稍微思考一下,可以知道这个程序的大体框架是: 遍历A的位置 遍历B的位置 判断A、B的位置组合是否满足要求。 如果满足,则输出。 因此,需要存储的是A 、B 的位置信息,并且每次循环都要更新。为了能够进行判断, 首先需要创建一个逻辑的坐标系统,以便检测A 何时会面对 B 。这里我们想到的方法是用 1~9 的数字,按照行优先的顺序来表示每个格点的位置(如图1-4 所示)。这样,只需要用 模余运算就可以得到当前的列号,从而判断A 、B 是否互斥。 1 2 3 4 5 6 7 8 9 图1-4 用1~9 的数字表示A 、B 的坐标 第二,题目要求只用一个变量,但是我们却要存储A 和B 两个子的位置信息,该怎么 办呢? 可以先把已知变量类型列举一下,然后做些分析。 对于bool 类型,估计没有办法做任何扩展了,因为它只能表示true 和false 两个值;而 byte 或者int 类型,它们能够表达的信息则更多。事实上,对本题来说,每个子都只需要9 个数字就可以表达它的全部位置。 一个8 位的byte 类型能够表达28=256 个值,所以用它来表示A 、B 的位置信息绰绰有余, 因此可以把这个字节的变量(设为b )分成两部分。用前面的4 bit 表示A 的位置,用后面的 4 bit 表示B 的位置,那么4 个bit 可以表示16 个数,这已经足够了。 问题在于:如何使用bit 级的运算将数据从这一byte 变量的左边和右边分别存入和读出。 下面是做法: 将byte b )的右边4 bit (0101 )设为n (0011 ): 首先清除b 右边的bits ,同时保持左边的bits: 写书评,赢取《编程之美——微软技术面试心得》/BCZM.asp (LMASK ) (b ) 然后将上一步得到的结果与n 做或运算 (LMASK b ) ^(n )

文档评论(0)

sunyi8246 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档