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));
		}
	}
}
posted @ 2020-11-17 16:36  BOTAK  阅读(96)  评论(0编辑  收藏  举报