三个嫌疑犯在法官面前各执一词,甲说:乙在说谎;乙说:丙在说谎;丙说:甲乙两个人都在说谎。法官为难,甲乙丙三个人到底谁在说谎?谁在说真话?
我们知道,三个人每个人都有两种可能,要么说真话,要么说假话,因此,通过穷举发,我们即可判断出最终的结果。
假设甲,乙,丙三个人所说的话用变量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
根据上面的分析,我们可以编写如下的程序代码:
- #include <stdio.h>
-
-
int main(int argc, char *argv[])
-
{
-
int a,b,c;
-
for(a=0; a<2; a++)
-
for(b=0; b<2; b++)
-
for(c=0; c<2; c++)
-
if((a&&!b || !a&&b) && (b&&!c || b&&c) && (c &&a+b == 0 || !c&&a+b != 0)){
- printf("甲 told a %s\n",a?"truth":"lie");
- printf("乙 told a %s\n",b?"truth":"lie");
- printf("丙 told a %s\n",c?"truth":"lie");
-
}
-
}
执行结果如下:
peng@ubuntu:~/src/test/c/suanfa/miaoqu$ ./a.out
甲 told a lie
乙 told a truth
丙 told a lie
阅读(2123) | 评论(0) | 转发(0) |