解题报告完整可编辑版.pptVIP

  1. 1、本文档共23页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
解题报告 中国象棋将帅问题 问题描述: 下过中国象棋的朋友都知道,双方的“将”和“帅”相隔遥远,并且不能照面。假设棋盘上只有“将”和“帅”二子,我们约定用A表示将,B表示帅。A,B二子被限制在己方3X3的格子里运动。例如,在如上的表格里,A被正方形{d10,f10,d8,f8}包围,而B被正方形{d.,f3,d1,f1}包围。每一步,A,B分别可以横向或纵向移动一格,但不能沿对角线移动。另外,A不能面对B,也就是说,A和B不能处于同一纵向直线上。请写出一格程序,输出A,B所有合法位置。要求在代码中只能使用一格字节存储变量。 分析与解法 遍历A的位置 遍历B的位置 判断A.B的位置组合是否满足要求 如果满足,则输出。 因此,需要存储的是A,B的位置信息,并且每次循环都要更新。首先创建一个逻辑坐标系统,一个可行的方法是用1~9的数字,按照行优先的顺序来表示每个格点的位置。这样只需要用模余运算就可以可到当前的列号,从而判断A,B是否互斥。 第二,题目要求只用一个变量,因此可以使用byte或int类型,他们能够表达的信息更多。事实上,对本题来说每个子都只需要9个数字就可以表示他的全部位子,所以一个8位的byte类型足矣,用前面4bit表示A的位置,用后面的4bit表示B的位置。 如何使用bit级的运算 将byte b的右边4bit(0101)设为(0011) 首先清除b右边的bits,同时保持左边的bits: LMASKb) -------然后将上一步得到的结果与n做或运算: LMASKb)|n)-------将byte b左边的4bit(1010)设为n(0011): 首先清除b左边的bits,同时保持右边的bits: RMASKb)------- 现在把n移动到byte数据的左边 n4然后对以上两步得到的结果做或运算,从而得到最终结果 RMASKb)|n4)-------代码清单 #includestdio.h #define HALF_BITS_LENGTH 4//这个值是记忆存储单元长度的一半,在这道题里是4bit #define FULLMASK 255//这个数字表示一个全部bit的mask,在二进制表示中,它#define LMASK(FULLMASKHALF_BITS_LENGTH) //这个宏表示左bits的mask,在二进制表示中,它#define RMASK (FULLMASKHALF_BITS_LENGTH) //这个数字表示右bits的mask,在二进制表示中,它表#define RSET(b,n)(b=((LMASKb) | (n)))//这个宏将b的右边设置成n #define LSET(b,n)(b=((RMASKb) | ((n)HALF_BITS_LENGTH)))//这个宏将b的左边设置成n #define RGET(b)(RMASKb)//这个宏得到b的右边的值 #define LGET(b)((LMASKB)HALF_BITS_LENGTH)//这个宏得到b的左边的值 #define GRIDW 3//这个数字表示将帅移动范围的行宽度 int main() { unsigned char b; for(LSEF(b,1);LGET(b)=GRIDW*GRIDW;LEST(b,(LGET(b)+1))) for(RSEF(b,1);RGET(b)=GRIDW*GRIDW;REST(b,(RGET(b)+1))) if(LGET(b)%GRIDW!=RGET(B)%GRIDW) printf(“A=%d,B=%d\n”,LGET(b),RGET(b)); return 0; } 解法二 BYTE i=81; While (i--) { if(i/9%3==i%9%3) cotinue; printf(“A=%d,b=%d\n”,i/9+1,i%9+1); } 解法三 struct{ unsigned char a:4; unsigned char b:s; }i; for(i.a=1;i.a=9;i.a++) for(i.b=1;i.b=9;i.b++) if(i.a%3!=i.b%3) printf(“A=%d,B=%d\n”,i.a,i.

文档评论(0)

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

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

1亿VIP精品文档

相关文档