题意:请写出一个程序,输出将、帅所有合法的位置,要求在代码中只使用一个变量

解法一:位运算,9个位置状态可以用4bit位表示,一共需要1byte。左边4bit,代表A的位置,右边4bit,代表B的位置,然后每次都去更新bit位即可。
package com.leetcode.test;
public class Test {
public static void main(String[] args) {
/**
* 1:0001 2:0010 3:0011 4:0100 5:0101 6:0110 7:0111 8:1000 9:1001
* 左边4bit,代表A的位置,右边4bit,代表B的位置
* 枚举左半所有的状态 0x10(000010000) - 0x90(10010000),每次加0x10 (A状态:i>>4 B状态 i&0xF)
*
*
16: 0001 0000
32: 0010 0000
48: 0011 0000
64: 0100 0000
80: 0101 0000
96: 0110 0000
112:0111 0000
128:1000 0000
*
*/
for (int i = 0x10; i < 0x90; i += 0x10){
/**
*
* 枚举A 和 B在棋盘中出现的所有可能位置状态 i
*/
for (i= (i & 0xF0) | (i >> 4); (++i & 0xF) < 10; ) {
/**
* 将和帅的位置差不能为3 or 6
*
*/
if (((i & 0xF) - (i >> 4)) != 3 && ((i & 0xF) - (i >> 4)) != 6)
{
System.out.println(String.format("A= %d , B =%d" , (i>>4),(i&0xF)));
System.out.println(String.format("A= %d , B =%d" , (i&0xF),(i>>4)));
}
}
}
}
}
这篇博客介绍了如何使用位运算技巧,仅用一个变量来表示象棋棋盘上将、帅的所有合法位置,通过位操作快速枚举并检查位置差条件。
446

被折叠的 条评论
为什么被折叠?



