日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。以下为4个嫌疑犯的供词。 A说:不是我。 B说:是C。 C说:是D。 D说:C在胡说 已知3个人说了真话,1个假话

方法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=二人说真话

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页