谁在说谎

2114阅读 0评论2011-04-20 whyliyi
分类:

    三个嫌疑犯在法官面前各执一词,甲说:乙在说谎;乙说:丙在说谎;丙说:甲乙两个人都在说谎。法官为难,甲乙丙三个人到底谁在说谎?谁在说真话?
    我们知道,三个人每个人都有两种可能,要么说真话,要么说假话,因此,通过穷举发,我们即可判断出最终的结果。
    假设甲,乙,丙三个人所说的话用变量a,b,c表示,0代表说假话,1代表说真话。
我们可以列出如下的式子:
if a == 1 else b = 0
if a == 0 else b = 1
if b == 1 else c = 0
if b == 0 else c = 1
if c == 1 else a+b = 0
if c == 0 else a+b = 1

根据上面的分析,我们可以编写如下的程序代码:
  1. #include <stdio.h>

  2. int main(int argc, char *argv[])
  3. {
  4.   int a,b,c;
  5.   for(a=0; a<2; a++)
  6.     for(b=0; b<2; b++)
  7.       for(c=0; c<2; c++)
  8.         if((a&&!b || !a&&b) && (b&&!c || b&&c) && (c &&a+b == 0 || !c&&a+b != 0)){
  9.            printf("甲 told a %s\n",a?"truth":"lie");
  10.            printf("乙 told a %s\n",b?"truth":"lie");
  11.            printf("丙 told a %s\n",c?"truth":"lie");
  12.     }
  13. }
执行结果如下:
peng@ubuntu:~/src/test/c/suanfa/miaoqu$ ./a.out 
甲 told a lie
乙 told a truth
丙 told a lie

上一篇:ZigBee重要变量说明
下一篇:从二维蚂蚁到N维宇宙(上)