知恵袋の男女が並ぶ場合の数の問題をJavaで解いてみた。(2)

 知恵袋の男女が並ぶ場合の数の問題Javaで解いてみました。(^_^;

男4人・女4人が一列で並ぶとき
① 男女が交互になる並び方
② ①の場合、特定の男Aと特定の女Aが隣り合う並び方

 今回は、男を大文字のABCD、女を小文字のabcdで表してみました。(^_^;
 文字列で、順列の横に男女表を作成するところは今回も同じです。

● Danjo2.java

/*
 * Danjo2.java
 * 
 */

class Danjo2 {
    static boolean nextPerm(char[] p, int n, int r) {
        int i, j;
        char t;
        
        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--){
                t = p[j]; p[j] = p[j-1]; p[j-1] = t;    // 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--);
        t = p[j]; p[j] = p[i-1]; p[i-1] = t;            // swap(p,j,i-1);
        for(j=n-1; i< j; i++, j--){
            t = p[i]; p[i] = p[j]; p[j] = t;            // swap(p,i,j);
        }
        return(true);
    }
    
    public static void main(String[] args) {
        final String P = "ABCDabcd";    // 男を大文字、女を小文字で表す
        char[] p = P.toCharArray();     // 順列生成用
        int n = p.length;
        
        long tm = System.nanoTime();    // Timer Start
        int count1 = 0, count2 = 0;
        do{
            String s = new String(p);
            s+=" ";
            for(int i=0; i< n; i++)     // 順列の横に男女表を作成
                s+=(Character.isUpperCase(p[i]) ? "男" : "女");
            if(s.contains("男男") || s.contains("女女")) continue;
            // チェックをくぐり抜けたものだけをカウント
            count1++;
            if(s.contains("Aa") || s.contains("aA")){
                count2++;
                //System.out.println(s);
            }
            //System.out.println(s);
        }while(nextPerm(p,n,n));
        System.out.println("(1) "+count1);
        System.out.println("(2) "+count2);
        tm=System.nanoTime()-tm;        // Timer Stop
        System.out.printf("Runtime : %.3f [sec]\n",(double)tm/1e9);
    }
}

●実行結果

(1) 1152
(2) 504
Runtime : 0.092 [sec]

※参考URL
http://www.javaroad.jp/java_character1.htm

知恵袋の男女が並ぶ場合の数の問題をJavaで解いてみた。
知恵袋の男女が並ぶ確率の問題をJavaで解いてみた。

スッキリわかるJava入門 第2版 (スッキリシリーズ)

スッキリわかるJava入門 第2版 (スッキリシリーズ)

わかりやすいJava入門編

わかりやすいJava入門編

Javaプログラマーなら習得しておきたい Java SE 8 実践プログラミング (impress top gear)

Javaプログラマーなら習得しておきたい Java SE 8 実践プログラミング (impress top gear)