标题:[求助]看不懂
只看楼主
企鹅
Rank: 1
等 级:新手上路
帖 子:93
专家分:0
注 册:2006-7-14
 问题点数:0 回复次数:4 
[求助]看不懂

背景:
诚实族和说谎族是来自两个荒岛的不同民族,诚实族的人永远说实话,而说谎族的人永远是假话。柯楠是一个聪明的人,他要来判断所遇到的人分别是哪个民族的。

某天柯楠遇到了三个人,知道他们可能来自诚实族或说谎族。为了调查这三个人是什么族的,柯楠分别问了他们问题。以下是三个人的回答。

问第一个人A:“你们是什么族的?”回答:“我们之中有两个来自诚实族”。第二个人B说:“不要胡说,我们三个人中只有一个诚实族的。”第三人C听了第二个人说的话,符合说:“对,就是只有一个诚实族的。”

柯楠很快知道了他们分别来自哪个民族。你能设计一个程序,看看柯楠是怎么办到的吗?三个人到底分别来自于哪个民族?

输入:
(无)

输出:
分别打印每个人(A、B和C)的信息,每人的信息占一行。比如:如果A是诚实族,则打印格式为:A is a honest. 反之,打印格式为: A is a lier.
#include"stdio.h"
main()
{ int a,b,c,c1=0,c2=0,c3=0;

for(a=0;a<=1;a++)

for(b=0;b<=1;b++)

for(c=0;c<=1;c++)

{ c1=a&&a+b+c==2||!a&&a+b+c==!2;

c2=b&&a+b+c==1||!b&&a+b+c==!1;

c3=c&&a+b+c==1||!c&&a+b+c==!1;

if(c1+c2+c3==3)

{if(a==1) printf("A is a honest.\n");

else printf("A is a lier.\n");

if(b==1) printf("B is a honest.\n");

else printf("B is a lier.\n");

if(c==1) printf("C is a honest.\n");

else printf("C is a lier.\n");

}

}

}
c1,c2,c3 是怎么复值的啊?

搜索更多相关主题的帖子: 柯楠 说谎 假话 民族 
2007-02-20 22:26
crackerwang
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:833
专家分:0
注 册:2007-2-14
得分:0 
c1=a&&a+b+c==2||!a&&a+b+c==!2;
c2=b&&a+b+c==1||!b&&a+b+c==!1;
c3=c&&a+b+c==1||!c&&a+b+c==!1;
上面的三个式子一该是和下面的式子意思是一样的
c1=(a&&a+b+c==2)||(!a&&a+b+c==!2);
c2=(b&&a+b+c==1)||(!b&&a+b+c==!1);
c3=(c&&a+b+c==1)||(!c&&a+b+c==!1);
我解释一下第一个式子:由前面的三个循环其实是给出了a,b,c的所有可能的真值指派,对于第一个人说的那句话其实就给出了真直指派的的条件,也就是:
如果a说对了,那么a,b,c中就应该有两个是对的,如果说错了a,b,c中就不应该有两个人说对了,两个假设必须有一个成立,否则真值指派是不成立的(
a&&a+b+c==2)假如a说对了(!a&&a+b+c==!2),代表的是a说错了,只有c1,c2,c3同时成立的时候才满足所有的逻辑条件,
写这个程序的人离散好强啊!!
佩服

2007-02-21 00:42
无玩过界
Rank: 1
等 级:新手上路
威 望:2
帖 子:246
专家分:0
注 册:2007-2-20
得分:0 
=优先级最低。

2007-02-21 10:48
企鹅
Rank: 1
等 级:新手上路
帖 子:93
专家分:0
注 册:2006-7-14
得分:0 
谢谢
2007-02-21 12:16
lidilidu
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2007-2-4
得分:0 

实在让人看不懂啊。。有高手能再讲解清楚些不!!

2007-02-22 02:44



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-121321-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019466 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved