知恵袋の「うそつき問題」をJavaで解いてみた。

 知恵袋の「うそつき問題」Javaで解いてみました。(^_^;
 たとえば、「犯人はCではない。」というのは、「犯人は、AまたはBまたはDまたはEまたはFまたはGまたはHまたはIである。」と同じですよね。(^_^;

 ある事件について事情を知っているA〜Iが、容疑者について以下のように発言している。この内本当のことを言っているのは3人で、残りの6人は嘘を言っている。本当のことを言っている3人の組み合わせとして正しいものはどれか。ただし実行犯が1人であることはわかっている。
A 犯人はEである。
B 犯人はEではない。
C 自分が犯人である。
D 犯人はCかHである。
E 自分が犯人である。
F 犯人はCである。
G 犯人はCではない。
H 犯人はCでも自分でもない。
I 犯人はEではないし、Hは嘘をついていない。

1 A、C、F
2 A、D、G
3 B、D、G
4 B、E、H
5 C、G、I

●Lair01.java

/*
 * Lair01.java
 */

class Lair01 {
    public static void main(String[] args) {
        final String WITNESS="ABCDEFGHI ";
        int[][] witness={
            {0,0,0,0,1,0,0,0,0},    // Aの証言
            {1,1,1,1,0,1,1,1,1},    // B  〃
            {0,0,1,0,0,0,0,0,0},    // C  〃
            {0,0,1,0,0,0,0,1,0},    // D  〃
            {0,0,0,0,1,0,0,0,0},    // E  〃
            {0,0,1,0,0,0,0,0,0},    // F  〃
            {1,1,0,1,1,1,1,1,1},    // G  〃
            {1,1,0,1,1,1,1,0,1},    // H  〃
            {1,1,0,1,0,1,1,0,1},    // I  〃
         };//A B C D E F G H I
        int[] s={0,0,0,0,0,0,0,0,0};
        
        long tm=System.nanoTime();      // Timer Start
        int n=9;
        String honest="";
        
        for(int i=0; i< 9; i++)
            for(int j=0; j< 9; j++)
                s[i]+=witness[j][i];
        for(int i=0; i< 9; i++)
            if(s[i]==3){ n=i; break; }
        for(int i=0; i< 9; i++)
            if(witness[i][n]==1)
                honest+=","+WITNESS.charAt(i);
        
        System.out.println("犯  人: "+WITNESS.charAt(n));
        System.out.println("正直者: "+honest.substring(1));
        tm=System.nanoTime()-tm;        // Timer Stop
        System.out.printf("Runtime : %.3f [sec]\n",(double)tm/1e9);
    }
}

●実行結果

犯  人: H
正直者: B,D,G
Runtime : 0.001 [sec]

※参考URL
ネットで見つけた「うそつき問題」をJavaで解いてみた。
ネットで見つけた「うそつき問題」を自分で解いてみた。
2つの発言の「うそつき問題」をJavaで解いてみた。