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

C说:是D。

D说:C在胡说。   等同于“不是D”

已知3个人说了真话,1个人说的是假话。

现在请根据这些信息,写一个程序来确定到底谁是凶手。

做之前的做题思路:

  • 如果说A说的是假话,即BCD说的都是真话。即  是A,是C,是D,不是D。他们的说法相互矛盾,所以这种推论是错误的。

  • 如果说B说的是假话,即ACD说的都是真话。即  不是A,不是C,是D,不是D。他们的说法相互矛盾,所以这种推论是错误的。

  • 如果说C说的是假话,即ABD说的都是真话。即  不是A,是C,不是D,不是D。此推论说明C是嫌疑人。

  • 如果说D说的是假话,即ABC说的都是真话。即  不是A,是C,是D,不是D。他们的说法相互矛盾,所以这种推论是错误的。

    借鉴之后的程序:

#include <stdio.h>
int main()
{

     int i,sum=0;     //sum是用来计数有几个人说了真话

     char killer;
     for(i=1;i<=4;i++)

     {

       killer=64+i;       //是为了输出A,B,C,D这4个字母   65(A)  66(B)  67(C)  68(D)

       sum=(killer!='A')+(killer=='C')+(killer=='D')+(killer!='D');       //此处是A,B,C,D各自的供词

       if(sum==3)            //即有3个人说的是真话

       {
         printf("凶手是%c\n",killer);
          break;
       }
     }
  return 0;

}

别人的程序,感觉更加完整:(加上了自己的注释)

//穷举法

#include<stdio.h>


int main()

{

  char killer;

  int i,sum=0;

  int kag=0;          

  for(i=1;i<=4;i++)

{

  killer=64+i;       //是为了输出A,B,C,D这4个字母   65(A)  66(B)  67(C)  68(D)

  sum=(killer!='A')+(killer=='C')+(killer=='D')+(killer!='D');     //这是A,B,C,D各自的供词,分别为:不是A,是C,是D,不是D

  if(sum==3)

  {

   kag=1;

   printf("killer is %c\n",killer);

   break;

  }

}

  if(kag==0)

{

  printf("cann't find killer!\n");

}

return 0;

}