问题
说谎族和诚实族是两个不同的民族。说谎族永远说谎话,诚实族永远说实话。谜语博士是个聪明人他要发现谁是说谎族谁是诚实族。谜语博士问了三个人。第一个人说:我们中有两个来自诚实族。第二个人说:我们中有一个来自诚实族。第三个说:我们中有一个来自诚实族。 问:他们三个到底来自什么族?
分析
每个人说话只有可能状态:诚实或者说谎。
程序
1: /** 2: * @file 053c.c 3: * @author Chaolong Zhang <emacsun@163.com> 4: * @date Fri Jul 12 19:09:55 2013 5: * 6: * @brief 说谎族和诚实族是两个不同的民族。说谎族永远说谎话,诚实族永远说实话。谜语博士是个聪明人他要发现谁是说谎族谁是诚实族。谜语博士问了三个人。第一个人说:我们中有两个来自诚实族。第二个人说:我们中有一个来自诚实族。第三个说:我们中有一个来自诚实族。 7: * 问:他们三个到底来自什么族? 8: * 9: */ 10: 11: #include <stdio.h> 12: #define N 2 13: 14: int main(int argc, char *argv[]) 15: { 16: int a,b,c; 17: 18: for (a=0; a < N; ++a){ 19: for (b = 0; b < N; ++b){ 20: for (c = 0; c < N; ++c){ 21: if ( ( ( a&&( a+b+c==2 ) ) || ( !a &&( a+b+c!=2 ) ) ) && 22: ( ( b&&( a+b+c==1 ) ) || ( !b &&( a+b+c!=1 ) ) ) && 23: ( ( c&&( a+b+c==1 ) ) || ( !c &&( a+b+c!=1 ) ) )){ 24: printf ("a is %s ",a?"honest":"lie"); 25: printf ("b is %s ",b?"honest":"lie"); 26: printf ("c is %s ",c?"honest":"lie"); 27: } 28: } 29: } 30: } 31: return 0; 32: }
结果
a is lie b is lie c is lie