標籤:sys and public generated 分享圖片 turn post void 過程
藍橋杯-全排列篩選(java)
藍橋杯每年必考全排列篩選,一般為填空題;
可以使用for迴圈暴力破解,但是代碼相對較長,也比較亂,不建議使用;
這裡使用遞迴來解決,代碼量相對較少,也很好理解;
如下為:0-9的全排列個數;
如需實現從0-9裡選n個數只需要改變dfs的參數k的傳值就可以了;
全排列模板代碼:
public class Main { static int count=0;// 計數器 public static void main(String[] args) { int[] arr = new int []{0,1, 2, 3,4,5,6,7,8,9};//數組元素為需要全排列的數,如果想排列字母改成char數組傳入就可以了 dfs(arr, 0, 10);// 改成dfs(arr,0,5)就是從中選5個數全排列 System.out.println(count); } // 遞迴全排列 public static void dfs(int arr[], int num, int k) { if (num == k) {// 遞迴出口 if (panDuan(arr)) {// 篩選 // 裡面可以輸出,計數,根據具體情況填寫 count++; /* for (int i = 0; i < arr.length; i++){ System.out.print(arr[i]);
}System.out.println(); */ } } for (int i = num; i < arr.length; i++) { swap(arr, num, i); dfs(arr, num + 1, k); swap(arr, num, i); } } // 篩選方法 private static boolean panDuan(int[] arr) {
// 根據題目的條件判斷篩選
return false; } // 數組元素交換,註:變數之間不可以用函數交換 public static void swap(int[] arr, int i, int j) { int t = arr[i]; arr[i] = arr[j]; arr[j] = t; }}
例題:
標題:五星填數
如【圖1.png】的五星圖案節點填上數字:1~12,除去7和11。
每條直線上數字和相等。
就是恰當的填法。
請你利用電腦搜尋所有可能的填法有多少種。
注意:旋轉或鏡像後相同的算同一種填法。
注意:這裡旋轉或鏡像:旋轉有5種相同狀態(旋轉360度過程中遇到五次一致的狀態),每種狀態有2種鏡像(二維圖形鏡像一般都是2種),所以結果要除以10;
public class Demo2 { static int count=0; public static void main(String[] args) { int arr[]=new int[]{1,2,3,4,5,6,8,9,10,12};//除去7,11 dfs(arr,0,10); System.out.println(count/10); } private static void dfs(int[] arr, int num, int k) { // TODO Auto-generated method stub if(num==k){ if(panDuan(arr)){ count++;// 條件達到,count++; } } for(int i=num;i<arr.length;i++){ swap(arr,num,i); dfs(arr,num+1,k); swap(arr,num,i); } } private static void swap(int[] arr, int num, int i) { // TODO Auto-generated method stub int temp=arr[num]; arr[num]=arr[i]; arr[i]=temp; } private static boolean panDuan(int[] arr) { // TODO Auto-generated method stub //判斷五條邊相等 int a1=arr[0]+arr[2]+arr[5]+arr[8]; int a2=arr[1]+arr[2]+arr[3]+arr[4]; int a3=arr[0]+arr[3]+arr[6]+arr[9]; int a4=arr[1]+arr[7]+arr[5]+arr[9]; int a5=arr[4]+arr[6]+arr[7]+arr[8]; /* 0 1 2 3 4 5 6 7 8 9*/ if(a1==a2&&a2==a3&&a3==a4&&a4==a5){ return true; }else return false; }}
全排列篩選(java)