知恵袋で見つけた判断推理のリーグ戦の問題をJavaで解いてみた。

 知恵袋で見つけた判断推理のリーグ戦の問題Javaで解いてみました。
 今回は選択肢のチェックは省略しました。(^_^;

● LeagueMatch1.java

/* 
 * LeagueMatch1.java
 * 
 * □abcdef(相手)
 * A\×□□○□ 1勝2敗2分
 * B○\□□□□
 * C□□\□□○ 1勝のみ
 * D□□□\□○ 3勝2敗
 * E×□□□\□ 2勝3敗
 * F□□××□\ 1勝3敗1分
 */
 
import java.util.Arrays;

class LeagueMatch1 {
    // 順列生成
    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);
    }
    
    static String sSort(String s) {
        char[] c=s.toCharArray();
        
        Arrays.sort(c);
        return(new String(c)); 
    }
    // 反対称な文字を求める
    static char revChar(char c) {
        if      (c=='○')   c='×';
        else if (c=='×')   c='○';
        return(c); // ○×以外は元の文字を返す
    }
    
    static boolean nextRepPerm(int[] p, int n, int r) {
        int cy=1;
        
        for(int i=r-1; i>=0; i--) {
            p[i]+=cy;
            if(p[i]>=n){
                p[i]=0; cy=1;
            } else
                cy=0;
        }
        if(cy==0) return(true); return(false);
    }
    
    public static void main(String[] args) {
        final String A = sSort("○××△△\");
        final String B = "○\□□□□";
        final String C = "□□\□□○";
        final String D = sSort("○○○××\");
        final String E = sSort("○○×××\");
        final String F = sSort("○×××△\");
        char[] a = A.toCharArray();
        char[] b = B.toCharArray();
        char[] c = C.toCharArray();
        char[] d = D.toCharArray();
        char[] e = E.toCharArray();
        char[] f = F.toCharArray();
        int [] r = new int[4];  // nextRepPerm用の初期値
        int iCount = 0;
        long tm=System.nanoTime();      // Timer Start
        a = A.toCharArray();
        do{    //--- a loop ---//
            if(a[0]!='\') continue;
            if(a[1]!='×') continue;
            d = D.toCharArray();
            do{    //--- d loop ---//
                if(d[3]!='\') continue;
                e = E.toCharArray();
                do{    //--- e loop ---//
                    if(e[4]!='\') continue;
                    if(e[0]!='×') continue;
                    f = F.toCharArray();
                    do{    //--- f loop ---//
                        if(f[5]!='\') continue;
                        if(f[2]!='×') continue;
                        if(f[3]!='×') continue;
                        for(int i=0; i< 4; i++) r[i]=0;
                        do{    //--- c loop ---//
                            c[0] = (r[0]==0 ? '×' : '△');
                            c[1] = (r[1]==0 ? '×' : '△');
                        //  c[2] = '\';
                            c[3] = (r[2]==0 ? '×' : '△');
                            c[4] = (r[3]==0 ? '×' : '△');
                        //  c[5] = '○';
                            
                            // 対角線に関する反対称性をチェック
                            if(a[2]!=revChar(c[0])) continue;
                            if(a[3]!=revChar(d[0])) continue;
                            if(a[4]!=revChar(e[0])) continue;
                            if(a[5]!=revChar(f[0])) continue;
                            
                            if(c[3]!=revChar(d[2])) continue;
                            if(c[4]!=revChar(e[2])) continue;
                            if(c[5]!=revChar(f[2])) continue;
                            
                            if(d[4]!=revChar(e[3])) continue;
                            if(d[5]!=revChar(f[3])) continue;
                                                        
                            if(e[5]!=revChar(f[4])) continue;
                            
                            // 対角線に関する反対称性からbを求める
                            b[0]=revChar(a[1]);                   ; b[2]=revChar(c[1]);
                            b[3]=revChar(d[1]); b[4]=revChar(e[1]); b[5]=revChar(f[1]);
                            // チェックをくぐり抜けたものだけを表示
                            iCount++;
                            System.out.println("["+iCount+"]");
                            System.out.println("□abcdef");
                            System.out.println("A" + new String(a));
                            System.out.println("B" + new String(b));
                            System.out.println("C" + new String(c));
                            System.out.println("D" + new String(d));
                            System.out.println("E" + new String(e));
                            System.out.println("F" + new String(f));
                            System.out.println();
                        }while(nextRepPerm(r,2,4));
                    }while(nextPerm(f,6,6));
                }while(nextPerm(e,6,6));
            }while(nextPerm(d,6,6));
        }while(nextPerm(a,6,6));
        
        tm=System.nanoTime()-tm;        // Timer Stop
        System.out.printf("Runtime : %.3f [sec]\n",(double)tm/1e9);
    }
}

●実行結果

[1]
□abcdef
A\×△×○△
B○\○○○○
C△×\××○
D○×○\×○
E××○○\×
F△×××○\

[2]
□abcdef
A\×△×○△
B○\△○○○
C△△\××○
D○×○\×○
E××○○\×
F△×××○\

Runtime : 0.019 [sec]

※参考URL
知恵袋で見つけた判断推理のリーグ戦の問題をPythonで解いてみた。
知恵袋で見つけた判断推理のリーグ戦の問題をPythonで解いてみた。(2)