题目
已知有四个人 A、B、C、D 是嫌疑人,四人分别陈述如下:
A说:不是我。
B说:是C。
C说:是D。
D说:C在胡说
已知3个人说了真话,1个人说的是假话。
现在请根据这些信息,写一个程序来确定谁是罪犯
分析
case 1: 如果说A说的是假话,即BCD说的都是真话。即 是A,是C,是D,不是D。说法相互矛盾,该推论错误。
case 2: 如果说B说的是假话,即ACD说的都是真话。即 不是A,不是C,是D,不是D。说法相互矛盾,该推论错误。
case 3: 如果说C说的是假话,即ABD说的都是真话。即 不是A,是C,不是D,不是D。此推论正确,C是嫌疑人。
case 4: 如果说D说的是假话,即ABC说的都是真话。即 不是A,是C,是D,不是D。说法相互矛盾,该推论错误。
因为说谎者即是罪犯,即只要找出说谎者就能解决问题
代码
public class Homework0515 {
public static void main(String[] args) {
char[] person = {'A', 'B', 'C', 'D'};
int temp = 0;
for(int i = 0; i < 4; i++){
if(( ( person[i] != 'A' ? 1 : 0 )
+ ( person[i] == 'C' ? 1 : 0 )
+ ( person[i] == 'D' ? 1 : 0 )
+ ( person[i] != 'D' ? 1 : 0 )
) == 3 ){
temp = i;
}
}
System.out.println( person[temp] + " 是罪犯");
}
}
总结
该题难点在于,怎么把陈述的内容,用代码进行表达,进而进行逻辑上的表示,并找出判定条件
思考
如果,4人分别陈述如下:
A说:不是我。
B说:不是D。
C说:是D。
D说:A说的对
仍是 3 个人说了真话,1 个人说的是假话。
判断:谁说谎,谁是罪犯
分析
case 1: 若A说谎,即BCD说的都是真话。即 (是A),不是D, 是D, A对-不是A。 说法相互矛盾,该推论错误。
1 0 1 0
case 2: 若B说谎,即ACD说的都是真话。即 不是A,(是D),是D, A对-不是A。 此推论说明D是嫌疑人。
0 1 1 0
case 3: 若C说谎,即ABD说的都是真话。即 不是A,不是D,(不是D),A对-不是A。 无法判断。
0 0 0 0
case 4: 若D说谎,即ABC说的都是真话。即 不是A,不是D,是D, (A错-是A)。 说法相互矛盾,该推论错误。
1 0 1 1
* B 说谎
* D 凶手
代码
待解答
若哪位大佬有解法,欢迎私聊或评论,一起探讨,感激不尽