方法1:
解题思路:
假设0是凶手,1是清白者
有一个人说的是假话,则可以分四种情况:
A假:
A=1,C=1,D=1,D=0,D矛盾,所以A真;
B假:
A=0;C=0;D=1;D=0;同理,D为真;
C假:
A=0; C=1;D=0;D=0;可断定C是凶手;
D假:
A=0;C=1;D=1;D=1;与只有一个凶手是矛盾的
代码如下:
#include <stdio.h>
#include <Windows.h>
int main()
{
int A = 0, B = 0, C = 0, D = 0;
int FD;//因为c和d的供词刚好对立 表示对立的
int i;
for (i = 1; i <= 4; i++)
{
if (i == 1)//A说的假
{
A = 1; C = 1; FD = 1; D = 0;
}
if (i == 2)//B说的假
{
A = 0; C = 0; FD = 1; D = 0;
}
if (i == 3)//C说的假
{
A = 0; C = 1; FD = 0; D = 0;
}
if (i == 4)//D的说的假
{
A = 0; C = 1; FD = 1; D = 1;
}
if (A + B + C + D + FD == 1 && FD == D)//只有一个人是凶手 当和为1时一个凶手出现 因为CD供词推出的都是D是不是 与上FD==D是为了排除D是D不是的情况
printf("A=%d B=%d C=%d D=%d\n", A, B, C, D);
}
system("pause");
return 0;
方法二:
#include <stdio.h>
#include <Windows.h>
int main()
{
int murder;
for (murder = 'A'; murder <= 'D'; murder++)
{
if (((murder != 'A') + (murder == 'C') + (murder == 'D') + (murder != 'D')) == 3) //三真一假,在if语句的,括号里为真结果为1,要是假结果为0。因此if括号 后面若成立,必定为三真一假,即必定等于3.
{
printf("murder is %c\n", murder); //由于最终要输出凶手,为一个字符,%c可用输出字符
}
}
system("pause");
return 0;
}
对if (((murder != ‘A’) + (murder == ‘C’) + (murder == ‘D’) + (murder != ‘D’)) == 3)的理解如下:
killer = A时:
killer!=‘A’的值为0 killer==‘C’ 为0 killer==‘D’ 为0 killer!=‘D’ 为1 0+0+0+1=一人说真话
killer = B时:
killer!=‘A’的值为1 killer==‘C’ 为0 killer==‘D’ 为0 killer!=‘D’ 为1
1+0+0+1=二人说真话
killer = C时:
killer!=‘A’的值为1killer==‘C’ 为1 killer==‘D’ 为0 killer!=‘D’ 为1 1+1+0+1=三人说真话
killer = D时:
killer!=‘A’的值为1killer==‘C’ 为0 killer==‘D’ 为1 killer!=‘D’ 为0 1+0+1+0=二人说真话