判断推理の順序関係の問題をJavaで解いてみた。(2)

 もう一問、判断推理の順序関係の問題Javaで解いてみました。(^_^;
 解が一通りに確定しないので、前回の問題よりちょっと難しいです。選択肢のチェックで、「&=」を使っているのは、解が一通りに確定しない場合の対策です。

 A〜Hの8人がマラソンをした結果、次のようになったことがわかっている。
一、AとHの間に2人ゴールインしている。
ニ、CはBおよびEどちらよりも先にゴールインした。
三、Gは3位以内で、AとFは共に4位以下であった。
四、BはDよりも早くゴールインした。
五、Gの直後にAがゴールインし、Hの直前にFがゴールインした。
以上のことから確実にいえることはどれか。
1.Dは5位でEは8位である
2.Gは2位でFは5位である
3.Cは1位でHは7位である
4.Bは2位でDは7位である
5.Aは4位でHは8位である

●Rank02.java

/*
 * Rank02.java
 * 
 */

class Rank02 {
    static final String RUNNER="ABCDEFGH";

    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);
    }
    
    // xがa[]の何番目にあるか調べるメソッド
    static int getPos(char[] a, char x) {
        for(int i=0; i<a.length; i++)
            if(a[i]==x) return(i);  // あるときは、0〜a.length-1を返す. 
        return(-1);                 // ないときは、-1を返す. 
    }
    
    public static void main(String[] args) {
        char[] r=RUNNER.toCharArray();
        boolean[] c={true,true,true,true,true};
        long tm=System.nanoTime();            // Timer Start
        
        do{
            //if(!()) continue; // 条件
            if(Math.abs( getPos(r,'A')-getPos(r,'H') )!=3) continue;    // 条件1
            if(!(getPos(r,'C')< getPos(r,'B'))) continue;               // 条件2
            if(!(getPos(r,'C')< getPos(r,'E'))) continue;               // 条件2
            if(!(getPos(r,'G')+1<=3)) continue;                         // 条件3
            if(!(getPos(r,'A')+1>=4)) continue;                         // 条件3
            if(!(getPos(r,'A')+1>=4)) continue;                         // 条件3
            if(!(getPos(r,'B')< getPos(r,'D'))) continue;               // 条件4
            if(!(getPos(r,'G')+1==getPos(r,'A'))) continue;             // 条件5
            if(!(getPos(r,'H')-1==getPos(r,'F'))) continue;             // 条件5
            // チェックを潜り抜けたものだけを表示
            System.out.println("#: 12345678");
            System.out.println("R: "+new String(r));
            System.out.println();
            // 選択肢のチェック
            if(getPos(r,'D')+1==5 && getPos(r,'E')+1==8) c[0]&=true; else c[0]&=false;
            if(getPos(r,'G')+1==2 && getPos(r,'F')+1==5) c[1]&=true; else c[1]&=false;
            if(getPos(r,'C')+1==1 && getPos(r,'H')+1==7) c[2]&=true; else c[2]&=false;
            if(getPos(r,'B')+1==2 && getPos(r,'D')+1==7) c[3]&=true; else c[3]&=false;
            if(getPos(r,'A')+1==4 && getPos(r,'H')+1==8) c[4]&=true; else c[4]&=false;
        }while(next_perm(r,8,8));
        System.out.print("∴");
        for(int i=0; i< 5; i++)
            if(c[i]) System.out.println(" "+(i+1));
        tm=System.nanoTime()-tm;        // Timer Stop
        System.out.printf("Runtime : %.3f [sec]\n",(double)tm/1e9);
    }
}

●実行結果

#: 12345678
R: CBGADFHE

#: 12345678
R: CBGAEFHD

#: 12345678
R: CEGABFHD

∴ 3
Runtime : 0.015 [sec]

数的推理 光速の解法テクニック―公務員試験 (公務員基本書シリーズ)

数的推理 光速の解法テクニック―公務員試験 (公務員基本書シリーズ)

数的推理がみるみるわかる! 解法の玉手箱[改訂版]

数的推理がみるみるわかる! 解法の玉手箱[改訂版]