甲说:“乙没有偷,是丁偷的。”
乙说:“我没有偷,是丙偷的。”
丙说:“甲没有偷,是乙偷的。”
丁说:“我没有偷,我用的那东西是我家里的。”
请根据上述四人答话,判断谁是偷窃者。
输入格式:无输入。
输出格式:输出一个字符,表示偷窃者是谁,A表示甲,B表示乙,C表示丙,D表示丁。
其实题目不难,但是需要注意的一点就是:无论一个人说的是真话还是假话,都能确定 几个人的状态 ,由于数据量不大通过暴力破解进行查找就可以找打结果。 对了再提示一个点就是:如果上下条件有冲突,说明这种情况不成立,就不用继续进行计算了直接continue吧。
# include <iostream>
# include <algorithm>
# include <sstream>
# include <stdio.h>
using namespace std;
int main (void)
{
甲乙丙丁
bool a,b,c,d;
bool A,B,C,D;
int sum=0,sss=0;
for(int i=0;i<=1;i++)
{
for(int j=0;j<=1;j++)
{
for(int x=0;x<=1;x++)
{
for(int y=0;y<=1;y++)
{
sss++;
if(i==1)//甲说:“乙没有偷,是丁偷的。”
{
b=0 ; d=1;
}else
{
b=1 ; d=0;
}
B=b ; D=d;//由于题目说:四个人的答话要么完全诚实,要么完全说谎。 因此通过甲可以确定 b,d 是否为小偷 用BD记录下来(当然也可以不用记录,只是记录下来比较清晰)
if(j==1)//乙说:“我没有偷,是丙偷的。”
{
b=0;c=1;
if(b!=B )//由于b 是否为小偷已经被确定,因此如果改变的b和确定的b有冲突 表示这种情况不成立,重新循环
{
sum++;
continue;
}
}
else
{
b=1;c=0;
if(b!=B )//由于b 是否为小偷已经被确定,进行比较,冲突就结束本次循环
{
sum++;
continue;
}
}
C=c;//同理记录下c的情况 ,方便下面判断
if(x==1)//丙说:“甲没有偷,是乙偷的。”
{
a=0;b=1;
if(b!=B )//由于b 是否为小偷已经被确定,进行比较,冲突就结束本次循环
{
sum++;
continue;
}
}else
{
a=1;b=0;
if(b!=B )//由于b 是否为小偷已经被确定,进行比较,冲突就结束本次循环
{
sum++;
continue;
}
}
if(y==1)//丁说:“我没有偷,我用的那东西是我家里的。”
{
d=0 ;
if(D!=d)//由于D 是否为小偷已经被确定,进行比较,冲突就结束本次循环
{
sum++;
continue;
}
}else
{
d=1;
if(D!=d)//由于D 是否为小偷已经被确定,进行比较,冲突就结束本次循环
{
sum++;
continue;
}
}
if(a+b+c+d==1)
{
if(a)
{
printf("A\n");
}
if(b)
{
printf("B\n");
}
if(c)
{
printf("C\n");
}
if(d)
{
printf("D\n");
}
}
a=0;b=0;c=0;d=0; //计算过后最好进行结果清零,当然不清对结果也没有影响
}
}
}
}
return 0;
}