1.2 中国象棋将帅问题
1.2 中国象棋将帅问题
请写出一个程序,输出A,B所有合法的位置,要求在代码中只使用一个变量。
位运算:采用一个8bit位,左边4bit,代表A的位置,右边4bit,代表B的位置,然后每次都去更新bit位即可。
class Test{
public static void main(String[] args) {
for (int i = 0x10; i < 0x90; i += 0x10)
for (i= (i & 0xF0) | (i >> 4); (++i & 0xF) < 10; )
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)));
}
}
}
利用数学
先看基本思路:
遍历A的位置
遍历B的位置
判断A,B是否满足条件
如果满足,print
对于任何一个数字\(x\) ,都可以重构成为\(x = x/y * y+ x %y\),然后下述代码中的\(i/9\)相当于内循环,\(i\%9\)相当于外循环,因为i的最大值是81,所以循环的范围就在0-8之间,然后我们打印的时候额外+1即可。真他娘的精妙。
class Test{
public static void main(String[] args) {
byte i = 81;
while(i-- > 0){
if(i/9%3 == i%9%3) continue;
System.out.println(String.format("A = %d ,B = %d",i/9+1,i%9+1));
}
}
}
Saying Less Doing More