判断推理の長距離走の問題をJavaで解いてみた。

 知恵袋で見つけた判断推理の長距離走の問題Javaで解いてみました。この問題は、順序関係と対応関係の融合問題のようです。(^_^;

 問題A〜Eの選手がそれぞれ赤、青、黄、緑、黒の異なる色のゼッケンを着け、長距離走を行った。
 次のことがわかっているとき、確実にいえるのはどれか。
(a) 青のゼッケンの選手がゴールした後、一人おいてから、Aがゴールした
(b) Bは赤のゼッケンの選手よりも先にゴールした
(c) CはEよりもさきにゴールした
(d) Dがゴールした後三人おいてから緑のゼッケンの選手がゴールした
(e) 黒のゼッケンの選手は4番目にゴールした
1、最初にゴールした選手は青のゼッケンをきていた
2、Aは4番目にゴールした
3、黄色のゼッケンの選手の次に赤のゼッケンの選手がゴールした
4、Cは黒のゼッケンの選手よりもさきにゴールした
5、Eは緑のゼッケンをつけていた

 ただし、条件に(a)〜(e)と名前をつけました。

● MarathonRunning1.java

/*
 * MarathonRunning1.java
 * 
 */

import java.util.Arrays;

class MarathonRunning1 {
    // 順列生成
    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);
    }
    // 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) {
        final String RUNNER="ABCDE";
        final String COLOR ="赤青黄緑黒";
        char[] r = RUNNER.toCharArray();
        char[] c = COLOR .toCharArray();
        boolean[] ch = {true,true,true,true,true};
        long tm=System.nanoTime();      // Timer Start
        
        Arrays.sort(c);
        do{    //--- c loop ---//
            if(!(getPos(c,'黒')+1==4)) continue;                    // 条件(e)
            r = RUNNER.toCharArray();
            do{    //--- r loop ---//
                if(!(getPos(c,'青')+2==getPos(r,'A'))) continue;   // 条件(a)
                if(!(getPos(r,'B')  < getPos(c,'赤'))) continue;   // 条件(b)
                if(!(getPos(r,'C')  < getPos(r,'E'))) continue;   // 条件(c)
                if(!(getPos(r,'D')+4==getPos(c,'緑'))) continue;   // 条件(d)
                // チェックを潜り抜けたものだけを表示
                System.out.println("#: 12345");
                System.out.println("R: "+new String(r));
                System.out.println("C: "+new String(c));
                System.out.println();
                // 選択肢のチェック
                if(getPos(c,'青')+1==1)                 ch[0]&=true; else ch[0]&=false;
                if(getPos(r,'A')+1==4)                 ch[1]&=true; else ch[1]&=false;
                if(getPos(c,'黄')+1==getPos(c,'赤'))    ch[2]&=true; else ch[2]&=false;
                if(getPos(r,'C')< getPos(c,'黒'))      ch[3]&=true; else ch[3]&=false;
                if(getPos(r,'E')==getPos(c,'緑'))      ch[4]&=true; else ch[4]&=false;
            }while(nextPerm(r,5,5));
        }while(nextPerm(c,5,5));

        System.out.print("∴");
        for(int i=0; i< 5; i++)
            if(ch[i]) System.out.println(" "+(i+1));
        tm=System.nanoTime()-tm;        // Timer Stop
        System.out.printf("Runtime : %.3f [sec]\n",(double)tm/1e9);
    }
}

●実行結果

#: 12345
R: DBACE
C: 青黄赤黒緑

#: 12345
R: DBCAE
C: 黄青赤黒緑

∴ 5
Runtime : 0.003 [sec]

EFFECTIVE JAVA 第2版 (The Java Series)

EFFECTIVE JAVA 第2版 (The Java Series)

パーフェクトJava (PERFECT SERIES) (PERFECT SERIES 2)

パーフェクトJava (PERFECT SERIES) (PERFECT SERIES 2)