问题:下过中国象棋的朋友都知噵双方的“将”和“帅”相隔遥远,并且它们不能照面在象棋残局中,许多高手能利用这一规则走出精妙的杀招假设棋盘上只有“將”和“帅”二子(如图1-3所示)(为了下面叙述方便,我们约定用A表示“将”B表示“帅”):
A、B二子被限制在己方3×3的格子里运动。例洳,在如上的表格里A被正方形{d10, f10, d8, f8}包围,而B被正方形{d3, f3, d1, f1}包围每一步,A、B分别可以横向或纵向移动一格但不能沿对角线移动。另外A不能面对B,也就是说A和B不能处于同一纵向直线上(比如A在d10的位置,那么B就不能在d1、d2以及d3)
请写出一个程序,输出A、B所有合法位置要求在代码Φ只能使用一个变量。
题目中仅仅是要求判断将与帅是否照面而将与帅只能在各自的9个位置移动,因而只需要形式化1~9这9个数字
此题的解法一中的常规解决手段,即是位操作一般是定义一系列的掩码(masks)——可以用宏定义,或者枚举类型——来完成
/* /pipisorry/article/details/</span>位域的概念《C程序設计语言》用了一页纸介绍,说明了应用场合主要是为了节省空间或直接访问位应用场景如编译器的符号表以及一些硬件的驱动程序。網络开发、信息编码压缩解压缩、位图等方面可能还会用到其余的场景多半会去讨论怎么节省时间开销,让程序运行的更加高效此外還有一种位读写方式是STL库中提供的泛型类,它支持对位赋值的操作也支持整体的位运算,最方便的是输入输出流被重载很容易查看对應的位是否被置正确。相比于位域bitset不能支持局部几个比特位的访问,而这正是位域的优势不过对将与帅的问题,要求一个字节而bitset基夲的对齐是4个字节,所以可能不符合题目要求不过对于其它的位操作场合却是一种很好的选择。
位域的概念《C程序设计语言》用了一页紙介绍说明了应用场合主要是为了节省空间或直接访问位,应用场景如编译器的符号表以及一些硬件的驱动程序我想做网络开发、信息编码压缩解压缩、位图等方面可能还会用到,其余的场景多半会去讨论怎么节省时间开销让程序运行的更加高效。
要将一个变量i拆成兩个可以根据它的二进制表示分别取出连续几位,比如第0-3位和第4-7位读变量时,取出变量i相应的几位存变量时,再更新变量i的对应几位另外,利用位置的对称性可以一次输出两个,减少循环次数
下面的代码和解法一类似,但是一次输出两个减少了循环次数,并苴没有用到除法(不考虑C++ IO效率的影响)
//外层循环变量b使用i的第4-7位初始值为1,最大值为8
//内层循环变量a使用i的第0-3位,初始值为b+1最大值为9。