逻辑推理题
谁是贼?
公安人员审问四名窃贼嫌疑犯。已知,这四人当中仅有一名是窃贼,还知道这四人中每人要么是诚实的,要么总是说谎。在回答公安人员的问题中:
甲说:“乙没有偷,是丁偷的。”
乙说:“我没有偷,是丙偷的。”
丙说:“甲没有偷,是乙偷的。”
丁说:“我没有偷”
请根据这四人的谈话判断谁是盗窃者
*问题分析
假设A、B、C、D分别代表四个人
1代表该人是窃贼;0代表不是贼
甲 A
乙 B
丙 C
丁 D
甲 A
0
1
乙 B
0
1
丙 C
0
1
丁 D
0
由题目已知:
1 四人中有且仅有一个窃贼;
2 这四个人中的每个人要么说真话,要么说假话;
3 由于甲、乙、丙三人都说了两句话:“X没偷,X偷了”,故不论该人是否说谎,他提到的两人中必有一人是小偷。
甲 A
乙 B
丙 C
丁 D
甲 A
0
1
甲 A说谎
1
0
乙 B
0
1
乙 B说谎
1
0
丙 C
0
1
丙 C
1
0
丁 D
0
丁 D说谎
1
故在列条件表达式时,可以不关心谁说谎,谁说实话。这样,可以列出下列条件表达式:
1 甲:B+D=1
2 乙:B+C=1
3 丙:A+B=1
丁说的是废话,但是不重要,反正有人偷了:A+B+C+D=1
package bb;
public class 谁是贼 {
public static final int A = 0, B = 1, C = 2, D = 3;
public static final int LEN = 4;
public static void main(String[] args) {
int i, _thief;
int a[] = new int[LEN];
for (i = 0; i < LEN; i++) {
// 数组初始化,每次假设一个人是贼(贼:1,其余:0)
// 0:1000
// 1:0100
// 2:0010
// 3:0001
for (_thief = 0; _thief < LEN; _thief++) {
if (_thief == i) {
a[_thief] = 1;
} else {
a[_thief] = 0;
}
System.out.print(_thief + ":" + a[_thief] + " ");
}
System.out.println();
if (a[B] + a[D] == 1 && a[B] + a[C] == 1 && a[A] + a[B] == 1) {
System.out.println("贼是: ");
for (_thief = 0; _thief < LEN; _thief++) {