題目: 下過中國象棋的朋友都知道,雙方的「將」和「帥」相隔遙遠,而且他們不能照面,在象棋殘局中,許多高手能利用這一規則走出精妙的殺招,假設棋盤上只有「將」和「帥」二子(如圖)(爲了下面敘述方便,咱們約定用A表示「將」,B表示「帥」): java
A、B二子被限制在己方的3x3的格子裏運動,例如,在如上表格里,A被正方形{d10,f10,d8,f8}包圍,而B被正方形{d3,f3,d1,f1}包圍。每一步,A、B分別能夠橫向或者縱向移動一格,可是不能沿對角線移動,另外,A不能面對B,也就是說,A和B不能處在一縱向直線上(好比A在d(10)的位置上,那麼B就不能在d一、d2以及d3)。 編程
請寫出一個程序,輸出A、B全部合法的位置,要求在代碼中只能使用一個變量。 .net
個人理解:下過象棋的都知道,將帥只能在「宮」中,並且不能碰面。這個題目就是要算出將帥有多少種合法的擺法。code
固然,這確定得用到循環。因此第一步,將棋盤座標有序化,將其可能的位置用數字表明:get
這樣就能夠用兩層循環+判斷解決問題了,可是有個限制,只能程序中使用一個變量!Java中的for循環果斷不能用啊!可是單用while也很差實現。 這裏我考慮將第一層循環與第二層循環合併,這樣就繞過這個問題咯。用一個兩位數的十位與個位分別表示A與B,那麼合併的循環就能夠取99:上代碼:it
public static void section1(){ int i = 99; while(i>10){ if(i%10!=0){ if((i/10 - 1)/3 != (i%10 - 1)/3){ System.out.println( "a:" + (i/10) + ",b:" + (i%10)); } } i--; } }
考慮好看,能夠添加兩個常量,表示位置,以下:io
public static void section2(){ final String[] a = {"d10","d9","d8","e10","e9","e8","f10","f9","f8"}; final String[] b = {"d3","d2","d1","e3","e2","e1","f3","f2","f1"}; int i = 99; while(i>10){ if(i%10!=0){ if((i/10 - 1)/3 != (i%10 - 1)/3){ System.out.println( "a:" + a[(i/10) -1] + ",b:" + b[(i%10) -1]); } } i--; } }
固然也能夠利用強制類型轉換,直接在輸出的字母,以下:for循環
public static void section3(){ int i = 99; while(i>10){ if(i%10!=0){ if((i/10 - 1)/3 != (i%10 - 1)/3){ System.out.println( "將:" + (char)((i/10 -1)/3 + 100) + ((i/10 -1)%3 + 8) + ",帥:" + (char)((i%10 -1)/3 + 100) + ((i%10 -1)%3 + 1)); } } i--; } }
最終結果:class
將:f10,帥:e3 將:f10,帥:e2 將:f10,帥:e1 將:f10,帥:d3 將:f10,帥:d2 將:f10,帥:d1 將:f9,帥:e3 將:f9,帥:e2 將:f9,帥:e1 將:f9,帥:d3 將:f9,帥:d2 將:f9,帥:d1 將:f8,帥:e3 將:f8,帥:e2 將:f8,帥:e1 將:f8,帥:d3 將:f8,帥:d2 將:f8,帥:d1 將:e10,帥:f3 將:e10,帥:f2 將:e10,帥:f1 將:e10,帥:d3 將:e10,帥:d2 將:e10,帥:d1 將:e9,帥:f3 將:e9,帥:f2 將:e9,帥:f1 將:e9,帥:d3 將:e9,帥:d2 將:e9,帥:d1 將:e8,帥:f3 將:e8,帥:f2 將:e8,帥:f1 將:e8,帥:d3 將:e8,帥:d2 將:e8,帥:d1 將:d10,帥:f3 將:d10,帥:f2 將:d10,帥:f1 將:d10,帥:e3 將:d10,帥:e2 將:d10,帥:e1 將:d9,帥:f3 將:d9,帥:f2 將:d9,帥:f1 將:d9,帥:e3 將:d9,帥:e2 將:d9,帥:e1 將:d8,帥:f3 將:d8,帥:f2 將:d8,帥:f1 將:d8,帥:e3 將:d8,帥:e2 將:d8,帥:e1
改進的地方:能夠利用九進制減小循環的次數,改循環數爲81,用除九的商表示A,除九的模表示B,《編程之美》書中,也有這種答案。用十進制是最早想到,也是最直觀的方法。變量