谁是窃贼

/*公安人员审问四名窃贼嫌疑犯。已知,这四人当中仅有一名是窃贼,还知道这四人中每人要么是诚实的,要么总是说谎的。在回答公安人员的问题中:
甲说:“乙没有偷,是丁偷的。”
乙说:“我没有偷,是丙偷的。”
丙说:“甲没有偷,是乙偷的。”
丁说:“我没有偷。”
请根据这四人的答话判断谁是盗窃者。
*问题分析与算法设计
假设A、B、C、D分别代表四个人,变量的值为1代表该人是窃贼。
由题目已知:四人中仅有一名是窃贼,且这四个人中的每个人要么说真话,要么说假话,而由于甲、乙、丙三人都说了两句话:“X没偷,X偷了”,故不论该人是否说谎,他提到的两人中必有一人是小偷。故在列条件表达式时,可以不关心谁说谎,谁说实话。这样,可以列出下列条件表达式:
甲说:”乙没有偷,是丁偷的。” B+D=1
乙说:“我没有偷,是丙偷有。” B+C=1
丙说:“甲没有偷,是乙偷的。” A+B=1
丁说:“我没有偷。” A+B+C+D=1
其中丁只说了一句话,无法判定其真假,表达式反映了四人中仅有一名是窃贼的条件。
*程序说明与注释
#include <stdio.h>
void main()
{int i,j,a[4];
for(i=0;i<4;i++) //假定只有第i个人为窃贼
{for(j=0;j<4;j++) //在第i轮假设中,假设第i个人为窃贼,把a[i]设为1,其余为0
{if(j==i)a[j]=1;
else a[j]=0;}
if(a[3]+a[1]==1&&a[1]+a[2]==1&&a[0]+a[1]==1) //判断条件是否成立
{printf("The thief is "); //成立
for(j=0;j<=3;j++) //输出计算结果
{if(a[j])printf("%c.",j+'A');
}
printf("\n");}}}


*/

笔者自己思考了一个通常的方法:

#include"stdio.h"
#include"stdlib.h"
#include"time.h"
int main()
{int a[4];//代表甲乙丙丁的结果
for(int k1=0;k1<2;k1++)
{if(k1)
{ a[1]=0; a[3]=1;}//真话原样
else { a[1]=1; a[3]=0; }
for(int k2=0;k2<2;k2++)
{if(k2&&k1)
 {a[1]=0; a[2]=1;}//甲乙两个人讲的话没有矛盾,同真,或者同假
else if(!k1&&!k2) {a[1]=1; a[2]=0;}
else continue;
for(int k3=0;k3<2;k3++)
{if(k3&&(!k1||!k2))//甲乙之中如果有一个人说了谎话,那么与丙说的话没有矛盾
{a[0]=0; a[1]=1;}
else if(!k3&&k1&&k2){a[0]=1; a[1]=0; }
else continue;
for(int k4=0;k4<2;k4++)
{if(k4&&!k1)
	a[3]=0;
else a[3]=1;
if(a[0]+a[1]+a[2]+a[3]==1)
for(int i=0;i<4;i++)
if(a[i]){printf("%d\n",i+1); break; }
}//end k4
}//end k3;
}//end k2;
}//end k1;
printf("\n");
system("pause");
}



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,您的问题是关于C语言判断四个嫌疑犯的问题。这个问题很有趣,让我们来看看解决方案。 问题描述: 有四个嫌疑犯,他们一个窃贼。警方询问他们的口供,得到以下信息: A:我不是窃贼。 B:C是窃贼。 C:窃贼肯定是D。 D:我不知道谁是窃贼。 请编写C语言代码,判断谁是窃贼。 解决方案: 我们可以使用if-else语句来解决这个问题。根据以上嫌疑犯的口供,我们可以得到以下结论: 1. 如果A说的是真话,那么他不是窃贼,其他三个人一个窃贼。 2. 如果B说的是真话,那么C是窃贼。 3. 如果C说的是真话,那么D是窃贼。 4. 如果D说的是真话,那么其他三个人一个窃贼。 根据以上结论,我们可以得到以下代码实现: ```c #include<stdio.h> int main() { int a,b,c,d; for(a=0;a<=1;a++) //a=0表示A是窃贼,a=1表示A不是窃贼 { for(b=0;b<=1;b++) //与上面类似 { for(c=0;c<=1;c++) //与上面类似 { for(d=0;d<=1;d++) //与上面类似 { if((a==0)+(b==1)+(c==d)+(d!=1)==3) //判断条件 { printf("窃贼是:"); if(a==1) printf("A\n"); //如果a=1,则A不是窃贼 if(b==1) printf("B\n"); //如果b=1,则C是窃贼 if(c==1) printf("C\n"); //如果c=1,则D是窃贼 if(d==1) printf("D\n"); //如果d=1,则A、B、C一个窃贼 } } } } } return 0; } ``` 代码解析: 我们使用了四重循环来枚举四个人是否是窃贼,每个人是否说了真话。if语句的判断条件根据以上结论得出,如果满足条件,则输出窃贼是谁。 最后,我们可以得到输出结果: ``` 窃贼是:C ``` 因此,C是窃贼。 希望这个解决方案可以帮助您理解并解决这个问题。如果您还有其他问题,请继续提出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值