一、问题:
在一把中国象棋的残局中,只剩下双方的“将”和“帅”,二者都只能在一个3*3的正方形区域内活动,二者不能面对面,也就是二者不能在同一纵向直线上。
请写出一个程序,输出二者所有的合法位置。要求在代码中只能使用一个字节存储变量。
如图:
二、书中的解法
本题本身的难点就在只是用一个字节来存储变量,其余的思路是很简单的。
:遍历A的位置
:遍历B的位置
:判断A、B的位置是否合法
:如果满足则输出
书中为A、B的位置信息转化为了一个逻辑坐标系统,如图所示:
然后就可以根据A、B的需要进行模余运算来判断A、B是否在一条纵向直线上,比如如果A是7,B是1二者对3取余得出的结果都是1,说明二者都在第一条纵向直线上,不合法。
那么还有一个关键的问题是二者的位置信息需要放在一个字节变量中。
由于一个字节是八位二进制,书中的方法是A、B各占前后四位用来存储1~9的位置信息。
采用移位运算和与运算求出A、B的位置信息,比如变量是00111001,把其和11110000进行与运算,保留了前四位得出00110000,然后右移四位得出A为0011=3,说明A是3号位置,同样把变量和00001111进行与运算之后直接得出结果是00001001=9,说明B是9号位置。
由于CSDN编辑太麻烦了,直接写在纸上拍下来了,将就着看吧:
三、自己的解法
我的想法是这样的,这个将和帅的位置其实是对称的,我何不如直接用4个bit来存储呢?其实到最后实际还是用了8位,具体请看:
字体写的不好看,请担待吧,真是累坏了,不过很高兴,如果有什么地方有错误,欢迎指出!