場合の数の問題をJavaで解いてみた

 「英語の次はジャバ語」らしいので、昨日のPythonのプログラムをJavaに翻訳してみました。(^_^;

●Outcomes.java

/*
 * Outcomes.java
 */

class Outcomes {
    static void swap(char[] s, int i, int j) {
        char t = s[i]; s[i] = s[j]; s[j] = t;
    }
    
    static boolean next_perm(char[] p, int n, int r) {
        int i, j, k;
        if(r <= 0 || n < r) return(false);
        for(i = r + 1; i <= n-1; i++)
            for(j = i; j >= r + 1 && p[j-1] < p[j]; j--)
                swap(p,j,j-1);
        for(i = n - 1; i > 0 && p[i-1] >= p[i]; i--);
        if(i==0) return(false);
        for(j = n - 1; j > i && p[i-1] >= p[j]; j--);
        swap(p,j,i-1);
        for(k = 0; k <= (n-i-1)/2; k++)
            swap(p,i+k,n-k-1);
        return(true);
    }
    
    public static void main(String[] args) {
        char[] p ="DEFdef".toCharArray();
        int c=0;
        long tm=System.nanoTime();      // Timer Start
        
        do{
            String s = new String(p);   // 隣接したらスキップ
            if(Math.abs(s.indexOf('D')-s.indexOf('d'))==1) continue;
            if(Math.abs(s.indexOf('E')-s.indexOf('e'))==1) continue;
            if(Math.abs(s.indexOf('F')-s.indexOf('f'))==1) continue;
            
            // チェックを潜り抜けたものだけをカウントして表示
            c++;
            System.out.printf("[%3d] : %s\n", c, s);
        }while(next_perm(p,6,6));
        
        tm=System.nanoTime()-tm;        // Timer Stop
        System.out.printf("Runtime : %.3f [sec]\n",(double)tm/1e9);
    }
}

●実行結果

[  1] : DEFdef
[  2] : DEFdfe
[  3] : DEFedf

…(省略)…

[238] : fedEFD
[239] : fedFDE
[240] : fedFED
Runtime : 0.360 [sec]

やさしいJava 第4版

やさしいJava 第4版

やさしいJava 活用編 第3版

やさしいJava 活用編 第3版

明解Java 入門編

明解Java 入門編

わかりやすいJava入門編

わかりやすいJava入門編

わかりやすいJavaオブジェクト指向編

わかりやすいJavaオブジェクト指向編

独習Java 第4版

独習Java 第4版