java 順列-permutation

TopCoder
この記事は約3分で読めます。

順列や組み合わせ難しい...
もっと経験を積まないと!

[java]
import java.util.ArrayList;

public class PermutationTest {

public static void main(String[] args) {
// ABCDの順列を考える
// 個数が4個あるので4!=24通りあることがわかるが・・・
// これを全部出力するコード4重ループから重複を除き以下のように書ける
String[] sarr = {"A","B","C","D"};
for (int i = 0; i < sarr.length; i++) {
for (int j = 0; j < sarr.length; j++) {
for (int k = 0; k < sarr.length; k++) {
for (int l = 0; l < sarr.length; l++) {
if(i==j||i==k||i==l||j==k||j==l||k==l){
continue;
}
System.out.println(sarr[i]+","+sarr[j]+","+sarr[k]+","+sarr[l]);
}
}
}
}
System.out.println("*****************************************");

// これでも良いが,個数が10個あった場合はどうだろう?
// 10!=3628800通りで,10重ループを書くのだろうか?
// 数学の力を借りる!http://itakanaya9.hatenablog.com/entry/2014/02/17/121428
// 文字の取り除きがあるため,リストに変換する
List<String> slist = new ArrayList<String>();

// 個数分のループを回す
int buff = factor(sarr.length);
for (int i = 0; i < buff; i++) {
slist.clear();
for (int j = 0; j < sarr.length; j++) {
slist.add(sarr[j]);
}
calc(slist, i, 1);
System.out.println("");
}

}

private static List<String> calc(List<String> slist,int i,int n){
if (n>4) return slist;
System.out.print(slist.get(i%n)+",");
slist.remove(i%n);
return calc(slist, i/n, n+1);
}

private static int factor(int n){
if(n<=1) return 1;
return n*factor(n-1);
}

// まじめに順列クラスを作るなら以下が参考になる
// http://iwsttty.hatenablog.com/entry/2014/03/24/011743
}
[/java]

コメント

タイトルとURLをコピーしました