排列ABCD用數組
package 經典的遞歸框架;
public class 排列ABCD用數組
{
public static void main(String[] args)
{
f("ABC".toCharArray(),0);
}
/**
* 數組法實現排列
* @param charArray 數組
* @param i 處理到的位置
*/
private static void f(char[] charArray, int i)
{
if (i==charArray.length-1)
{
System.out.println(new String(charArray));
return ;
}
// 從當前位置開始 與後面的交換
for (int j = i; j < charArray.length; j++)
{
char temp=charArray[i];
charArray[i]=charArray[j];
charArray[j]=temp;//交換i j的位置形成一種排列
f(charArray, i+1);
temp=charArray[i];
charArray[i]=charArray[j];
charArray[j]=temp;//回溯
}
}
}
爲什麼從當前處理到的位置i開始而不是從頭開始呢?,如果從頭開始的話 會出現重複的
組合問題
package 經典的遞歸框架; public class 組合重複AABBBC用數組 { public static void main(String[] args) { //AABBBC取三個 重複 // int[] data={2,3,1};//每個位置的元素最多取個數 //ABCDEF去重複 int[] data={1,1,1,1,1};//每個位置的元素最多取個數 int x[]=new int[data.length];//每個元素取幾個 f4(data,x,0,3); } /** * * @param data 每個位置的元素最多取個數 * @param x 取法 * @param k 當前位置 * @param goal 還要取得個數 */ private static void f4(int[] data, int[] x, int k, int goal) { if (k==x.length) {//取到最後一個元素了 if (goal==0) {//不用取了 printQueue(x); } return; } for (int i = 0; i <= Math.min(goal, data[k]); i++) { //最多能取多少 x[k]=i;//取幾個 0 1 2 3 ...... min f4(data, x, k+1, goal-i); } x[k]=0;//回溯 只需在返回前恢復現場就可以了 } private static void printQueue(int[] x) { StringBuffer stringBuffer=new StringBuffer(); for (int i = 0; i < x.length; i++) { for (int j = 0; j < x[i]; j++) { stringBuffer.append((char)(i+'A')+" "); } } System.out.println(stringBuffer.toString().trim()); } }
真題演練
標題:紙牌三角形
A,2,3,4,5,6,7,8,9 共9張紙牌排成一個正三角形(A按1計算)。要求每個邊的和相等。
下圖就是一種排法(如有對齊問題,參看p1.png)。
A
9 6
4 8
3 7 5 2
這樣的排法可能會有很多。
如果考慮旋轉、鏡像後相同的算同一種,一共有多少種不同的排法呢?
請你計算並提交該數字。
注意:需要提交的是一個整數,不要提交任何多餘內容。
package 藍橋17;
import java.awt.Checkbox;
public class B紙牌三角形
{
static int count;
public static void main(String[] args)
{
String string="123456789";
f(string.toCharArray(),0);
System.out.println(count/6);//這裏其實是count/3/2,除以3是排除了旋轉,除以2是排除了鏡像
}
private static void f(char[] charArray, int i)
{
if (i==charArray.length)
{
String string=new String(charArray);
if (check(string))
{
count++;
System.out.println(string);
}
}
for (int j = i; j < charArray.length; j++)
{
char temp=charArray[j];charArray[j]=charArray[i];charArray[i]=temp;
f(charArray, i+1);
temp=charArray[j];charArray[j]=charArray[i];charArray[i]=temp;
}
}
private static boolean check(String string)
{
int a=getCount(string.substring(0, 4));
int b=getCount(string.substring(3, 7));
int c=getCount(string.substring(6, 9)+string.charAt(0));
if (a==b&&b==c)
{
return true;
}
return false;
}
private static int getCount(String substring)
{
int coun=0;
for (int i = 0; i < substring.length(); i++)
{
coun+=Integer.parseInt(substring.charAt(i)+"");
}
return coun;
}
}
這裏其實是count/3/2,除以3是排除了旋轉,除以2是排除了鏡像