知恵袋の「うそつき問題」を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で解いてみた。