Chinaunix首页 | 论坛 | 博客
  • 博客访问: 425028
  • 博文数量: 47
  • 博客积分: 1669
  • 博客等级: 上尉
  • 技术积分: 585
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-04 23:27
文章分类

全部博文(47)

文章存档

2011年(23)

2010年(24)

分类:

2011-04-20 21:01:03

原文地址:谁在说谎 作者:chengxiaopeng

    三个嫌疑犯在法官面前各执一词,甲说:乙在说谎;乙说:丙在说谎;丙说:甲乙两个人都在说谎。法官为难,甲乙丙三个人到底谁在说谎?谁在说真话?
    我们知道,三个人每个人都有两种可能,要么说真话,要么说假话,因此,通过穷举发,我们即可判断出最终的结果。
    假设甲,乙,丙三个人所说的话用变量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

阅读(2123) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~