天天看點

java 實作全排列

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.util.ArrayList;

import java.util.List;

import java.util.ListIterator;

public class Main {

// 定義數組存儲那些數組是被通路過的

public static boolean v[]=new boolean[100];

public static List<List<Integer>> sumNum =new ArrayList<List<Integer>>();

// 主函數

public static void main(String[] args) throws IOException {

// 輸入

BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));

String[] str = bf.readLine().split(" ");

int[] arrayFull=new int[str.length];

for(int i=0;i<str.length;i++){

arrayFull[i]=Integer.parseInt(str[i]);

}

// 搜尋

slove(0,arrayFull);

// 輸出結果

ListIterator<List<Integer>> ls = sumNum.listIterator();

while(ls.hasNext()){

List<Integer> lls = ls.next();

for (Integer llsnums : lls) {

System.out.print(llsnums);

}

System.out.println();

}

}

// 動态規劃函數

private static void slove(int i, int[] arrayFull) {

// 表示 目前次周遊結束

if(i>=arrayFull.length){

ArrayList<Integer> r = new ArrayList<Integer>();

for(int j=0;j<arrayFull.length;j++){

if(v[j]){

r.add(arrayFull[j]);

}

}

sumNum.add(r);

return;

}

v[i]=true;

slove(i+1, arrayFull);//yes

v[i]=false;

slove(i+1, arrayFull);//no

}

}