甲、乙、丙、丁四人的血型各不相同,甲说:“我是 A 型”。乙说:“我是0型”。丙说:“我是 AB 型”。丁说:“我不是 AB 型”。四个人中只有一个人的话是假的。真实情况如何?
大家可以分享一下思路嘛
假设法,假设甲说假话:结果就是B,O,AB,A
假设乙说假话:结果就是A,B,AB,O
假设丙说假话:无结果
假设丁说假话:无结果
血型一共有四种 A B O AB 用数字 1 2 3 4代表 和为1+2+3+4固定值是10
设真为1 假为0
其他的与排名次问题一样
写三层循环
最内层内部判断逻辑就是满足 四个逻辑值和为1 时跳出循环
用c语言写了可以参考下 如果没有+运算可以用三目运算符转
#include <stdio.h>
//甲、乙、丙、丁四人的血型各不相同,甲说:“我是 A 型”。乙说:“我是0型”。
//丙说:“我是 AB 型”。丁说:“我不是 AB 型”。
//四个人中只有一个人的话是假的。真实情况如何?
int main()
{
int a,b,c,d;//甲乙丙丁四人
// 假设四种血型 A B O AB 对应为数字1,2,3,4
for(a=1;a<=4;a++)
{
for(b=1;b<=4;b++)
{
if(a!=b)
{
for(c=1;c<=4;c++)
{
if(c!=b && c!=a)
{
d=10-a-b-c;
if(d!=a && d!=b && d!=c)
{
if( (
((a!=1)&&(b==3)&&(c==4)&&(d!=4)) +//若甲说谎
((a==1)&&(b!=3)&&(c==4)&&(d!=4)) + //若乙说谎
((a==1)&&(b==3)&&(c!=4)&&(d!=4)) + //若丙说谎
((a==1)&&(b==3)&&(c==4)&&(d==4)) )==1 //若丁说谎 只有一人说谎所以四个表达式值加起来为1时能得到正确结果
)
{
printf("甲:%d\n乙:%d\n丙:%d\n丁:%d\n",a,b,c,d);
printf("\n");
}
}
}
}
}
}
}
}