《编程之美》1.2 中国象棋将帅问题 学习笔记

6 篇文章 0 订阅
2 篇文章 0 订阅

题目要求:中国象棋将帅问题

书中给出了三种解法

解法一:主要就是讲解按位运算的技巧。例如 1 byte字符,

  1. 如果需要保留低四位,重设高四位的值,则按位‘与’00001111,再将结果按位‘或’新设置的值n(这里的n需要左移位n<<4)。反之,如果需要保留高四位的值,重设低四位的值,则按位 ‘与’11110000,再将结果按位‘或’需要设置的值
  2. 总结就是【'与'上‘1’->取值,‘或’上n设值】。

解法二:这个解法的关键就是将这两个棋盘一共有 9*9=81种可能,则当A的棋子在(0001)位置时,B的棋子可以在对应棋盘的其他任意位置。

这里需要注意的技巧性是 81/9 取十位数字,81%9取个位数字。同时,题目要求两方的棋子不可以在同一列位置上,则在棋盘范围里,将他们的数值对3取余数是不一样的,那么这样的棋子摆放就是成立的。(在需要进行进制转换的时候这个是很常用的方法!)

所以有

if(i / 9 % 3 == i % 9 % 3)  //判断位置是否合法
        continue;
 printf..........

解法三:一个很特别的结构体

struct
{
         unsigned char a:4;
         unsigned char b:4;
}i;
32位系统中charl类型占用一个字节(1 Byte),这里在结构体中设置位域,a,b各占四位,满足题目条件只用一个字节完成变量存储。

只能在结构体里使用,建议尽量少用,会破坏程序的移植性。

当结构体中的元素的取值范围很小时,可以将几个字段按位合成一个字段来表示,起到节省内存空间的作用。


tips:32位系统中,char  (1 Byte)

                            int     (4 Byte)

建议声明结构体时,按照不同变量的类型,按占用空间的大小升序或降序声明会取得较好的空间占用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值