1. 程式人生 > 實用技巧 >1.2 中國象棋將帥問題

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));
		}
	}
}