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





