知恵袋で見つけた赤玉と白玉の組分けの問題をJavaで解いてみた。

 知恵袋で見つけた赤玉と白玉の組分けの問題Javaで解いてみました。

 赤玉7個と白玉5個をA,B,C の三つのはこに入れる
(1) 赤玉7個と白玉5個を3つの箱に入れる入れ方。ただし空の箱があってもよいとする
(2) 空箱を許さないとき赤玉7個と白玉5個を3つの箱に入れる入れ方

 重複組合せの応用問題のようです。丸(○)と仕切り(|)の同じものを含む順列のやり方を使ってみました。(^_^;
 ちなみに、(1)を高校の数学で解けば、次の通りです。(^_^;
 {}_{3}H_{7}\times{}_{3}H_{5} = {}_{3+7-1}C_{7}\times{}_{3+5-1}C_{5} = 36\times21 = 756

※参考URL
組み分け全パターン

● RepeatedComb1.java

/* 
 * RepeatedComb1.java
 * 
 */

class RepeatedComb1 {
    // 順列生成
    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 R="赤赤赤赤赤赤赤||";    // 昇順ソート済み
        final String W="白白白白白||";        // 〃
        char[] r = R.toCharArray(); // 順列生成用
        char[] w = W.toCharArray(); // 〃
        int iCnt1 = 0, iCnt2 = 0;
        long tm=System.nanoTime();      // Timer Start
        
        do{ //--- r loop ---//
            w = W.toCharArray();
            do_cont:
            do{ //--- w loop ---//
                iCnt1++;
                String[] rABC = new String(r).split("|",-1);
                String[] wABC = new String(w).split("|",-1);
                for(int i = 0; i< 3; i++)
                    if((rABC[i]+wABC[i]).equals(""))
                        continue do_cont;
                // チェックを潜り抜けたものだけをカウント
                iCnt2++;
            }while(nextPerm(w,7,7));
        }while(nextPerm(r,9,9));
        
        System.out.println("(1) "+iCnt1);
        System.out.println("(2) "+iCnt2);
        
        tm=System.nanoTime()-tm;        // Timer Stop
        System.out.printf("Runtime : %.3f [sec]\n",(double)tm/1e9);
    }
}

●実行結果

(1) 756
(2) 615
Runtime : 0.037 [sec]

※参考URL
知恵袋で見つけた赤玉と白玉の組分けの問題をJavaで解いてみた。(2)

スッキリわかるJava入門

スッキリわかるJava入門

わかりやすいJava入門編

わかりやすいJava入門編