全排列篩選(java)

來源:互聯網
上載者:User

標籤: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)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.