谜语博士的难题2

两面族是荒岛上的一个新民族,他们的特点是说话真一句假一句且真假交替。如果第
一句为真,则第二句是假的;如果第一句为假的,则第二句就是真的,但是第一句是真
是假没有规律。
 迷语博士遇到三个人,知道他们分别来自三个不同的民族:诚实族、说谎族和两面族。
三人并肩站在博士前面。
 博士问左边的人:“中间的人是什么族的?”,左边的人回答:“诚实族的”。
 博士问中间的人:“你是什么族的?”,中间的人回答:“两面族的”。
 博士问右边的人:“中间的人究竟是什么族的?”,右边的人回答:“说谎族的”。

 请问:这三个人都是哪个民族的?


思路:     遇到这类逻辑判断问题,应当将每个人说的话,每个人自身的条件充分考虑,还要考虑是否有其他的影藏条件

本题三个人来自三个族,所以输出的结果是对应谁是哪个族,两面族是一个特殊情况,必须将两面和诚实分开考虑

分析:     a,b,c表示3个人取值为0(说谎)  到   1(诚实), aa, bb,  cc为代表两面,取值为0(说谎)到1(诚实)

穷举从0到1

当a为诚实时的情况  , 当b为诚实情况  ,当c为诚实情况

当a为两面时的情况  , 当b为两面情况  ,当c为两面情况

当a为说谎时的情况  , 当b为说谎情况  ,当c为说谎情况

a+b+c值只能为,只有1个是诚实的,aa+bb+cc值只能为1,只有一个是两面的

a和aa,b和bb,c和cc不能同时为1,也就是不能同时为诚实或两面

代码



#include<stdio.h>
main()
{
	int a,b,c,aa,bb,cc;
	for (a=0;a<2;a++)
		for (b=0;b<2;b++)
			for (c=0;c<2;c++)
	         	for (aa=0;aa<2;aa++)
					for (bb=0;bb<2;bb++)
	                	for (cc=0;cc<2;cc++)
						
						{
							if((a==1&&aa!=1&&b==1||b==1&&bb!=1||c==1&&cc!=1&&b==0&&bb==0)&&//a,b,c均为诚实,
								(a+aa<=1&&b+bb<=1&&c+cc<=1)&&(a+b+c==1&&aa+bb+cc==1)&&  //3个人来自3个不同的族       
							    (aa==1&&a!=1||bb==1&&b!=1||cc==1&&c!=1)&&//a,b,c为两面
								(a==0&&aa!=0&&b!=1&&bb<2||b==0&&bb!=1||c==0&&cc!=1&&b!=0&&bb!=0)//a,b,为说谎	
								)
							{
								printf("左边的为 %s.\n",aa?"两面":(a?"诚实":"说谎")); //条件嵌套,输出汉字为字符串s

							printf("中间的为 %s.\n",bb?"两面":(b?"诚实":"说谎"));

							printf("右边的为 %s.\n",cc?"两面":(c?"诚实":"说谎"));
							}
						}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值