编程之美读书笔记_1.2_中国象棋将帅问题

本文探讨了中国象棋将帅问题的解决策略,通过将变量拆分和利用位置对称性,提出了一种高效算法,减少了循环次数,避免了使用除法运算。文中还对比了多种解法,指出了解法一与解法三的本质相似性,并通过代码实例展示了解法的实现。

 1.2 中国象棋将帅问题


当初,刚看到题时,首先想到的是除法计算除数的商和余数(eax 和edx )。后来才想到需要动态**数组时,new 一维数组,用它模拟**数组时,**数组的下标和实际偏移量的转换,我想很多人学习C 或C++ 时都做过这种事吧。

本来以为题目要求输出将帅在棋盘上的具体位置,如d10 、f1 ,书中的解法给的是相对位置,解决起来更简单。解法一用了一堆令人讨厌的宏,代码实在不美,解法三和解法一本质是一样的,虽然解法三只定义了一个结构体,但结构体内有两个变量,不合题意才对。

要将一个变量i 拆成两个,可以按其的二进制表示,取出连续几位,比如第0-3 位和第4-7 位,读变量时,取出变量i 相应的几位,存变量时,再更新变量i 的对应几位。另外,再利用位置的对称性,可以一次输出两个,减少循环次数。

下面的代码和解法一类似,但是一次输出两个,减少了循环次数,并且没有用到除法,如果不考虑C++ IO 效率的影响,会比解法二和解法三都高效。

(flyinghearts)

原贴地址:http://blog.youkuaiyun.com/flyinghearts/archive/2010/05/18/5603669.aspx

 

扩展阅读 

 

 

 

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值