正文

53.迷语博士的难题(1)2005-09-10 15:13:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/xiangyu/1703.html

分享到:

53.迷语博士的难题(1) 诚实族和说谎族是来自两个荒岛的不同民族,诚实族的人永远说真话,而说谎族的人永远说假话。迷语博士是个聪明的人,他要来判断所遇到的人是来自哪个民族的。 迷语博士遇到三个人,知道他们可能是来自诚实族或说谎族的。为了调查这三个人是什么族的,博士分别问了他们的问题,这是他们的对话: 问第一个人:“你们是什么族?”,答:“我们之中有两个来自诚实族。”第二个人说:“不要胡说,我们三个人中只有一个是诚实族的。”第三个人听了第二个人的话后说:“对,就是只有一个诚实族的。” 请根据他的回答判断他们分别是哪个族的。 *问题分析与算法设计 假设这三个人分别为A、B、C,若说谎其值为0,若诚实,其值为1。根据题目中三个人的话可分别列出: 第一个人: a&&a+b+c==2||!a&&a+b+c!=2 第二个人: b&&a+b+c==1||!b&&a+b+c!=1 第三个人: c&&a+b+c==1||!c&&a+b+c!=1 利用穷举法,可以很容易地推出结果。 *程序与程序注释 #include<stdio.h> void main() { int a,b,c; for(a=0;a<=1;a++) /*穷举每个人是说谎还是诚实的全部情况*/ for(b=0;b<=1;b++) /*说谎:0 诚实:1*/ for(c=0;c<=1;c++) if((a&&a+b+c==2||!a&&a+b+c!=2) /*判断是否满足题意*/ &&(b&&a+b+c==1||!b&&a+b+c!=1) &&(c&&a+b+c==1||!c&&a+b+c!=1)) { printf("A is a %s.\n",a?"honest":"lier"); /*输出判断结果*/ printf("B is a %s.\n",b?"honest":"lier"); printf("C is a %s.\n",c?"honest":"lier"); } } *运行结果 A is a lier (说谎族) B is a lier (说谎族) C is a lier (说谎族) *思考题 迷语博士遇到四个人,知道他们可能是来自诚实族和说谎族的。为了调查这四个人是什么族的,博士照例进行询问:”你们是什么族的?“ 第一人说:”我们四人全都是说谎族的。“ 第二人说:”我们之中只有一人是说谎族的。“ 第三人说:”我们四人中有两个是说谎族的。“ 第四人说:”我是诚实族的。“ 问自称是“诚实族”的第四个人是否真是诚实族的? (答案:第四个人是诚实族的。)

阅读(3631) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册