Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2545024
  • 博文数量: 308
  • 博客积分: 5547
  • 博客等级: 大校
  • 技术积分: 3782
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-24 09:47
个人简介

hello world.

文章分类

全部博文(308)

分类: C/C++

2011-04-19 18:18:48

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

阅读(3942) | 评论(4) | 转发(4) |
0

上一篇:递归实现数制转换

下一篇:穷举法思想

给主人留下些什么吧!~~

chengxiaopeng2011-05-20 14:37:36

网络安全服务: 谁说真话.....
乙说真话。

网络安全服务2011-05-20 14:32:17

谁说真话

chengxiaopeng2011-04-22 11:40:31

nonickname: 前提是只有一个人说真话?.....
对,应该是。

nonickname2011-04-22 00:17:56

前提是只有一个人说真话?