用C++来解答下面这个问题,但是答案中我有几点疑惑,求高手解答,麻烦了 20
警察审问四名窃贼嫌疑犯。已知,这四人当中仅有一名是窃贼,还知道这四个人中每人要么是诚实的,要么总是说谎。他们给警察的回答是:甲说:“乙没有偷,是丁偷的。”乙说:“我没有偷...
警察审问四名窃贼嫌疑犯。已知,这四人当中仅有一名是窃贼,还知道这四个人中每人要么是诚实的,要么总是说谎。他们给警察的回答是:
甲说:“乙没有偷,是丁偷的。”
乙说:“我没有偷,是丙偷的。”
丙说:“甲没有偷,是乙偷的。”
丁说:“我没有偷。”
请根据这四个人的回答判断谁是窃贼。
请根据这四个人的回答判断谁是窃贼,窃贼用数值1表示,不是窃贼用0表示
一行输出四个数,中间用空格隔开(按甲,乙,丙,丁的顺序
假设用A、B、C、D分别代表四个人,变量的值为1代表该人是窃贼,则根据四个人的说法可列出4个条件:B+D=1;B+C=1;A+B=1;A+B+C+D=1。
#include<stdio.h>
int main()
{
int i,j,a[4];
for(i=0;i<4;i++) /*假定只有第i个人为窃贼*/
{
for(j=0;j<4;j++) /*将第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");
}
}
} 最好能够分析一下全部的解答思路 展开
甲说:“乙没有偷,是丁偷的。”
乙说:“我没有偷,是丙偷的。”
丙说:“甲没有偷,是乙偷的。”
丁说:“我没有偷。”
请根据这四个人的回答判断谁是窃贼。
请根据这四个人的回答判断谁是窃贼,窃贼用数值1表示,不是窃贼用0表示
一行输出四个数,中间用空格隔开(按甲,乙,丙,丁的顺序
假设用A、B、C、D分别代表四个人,变量的值为1代表该人是窃贼,则根据四个人的说法可列出4个条件:B+D=1;B+C=1;A+B=1;A+B+C+D=1。
#include<stdio.h>
int main()
{
int i,j,a[4];
for(i=0;i<4;i++) /*假定只有第i个人为窃贼*/
{
for(j=0;j<4;j++) /*将第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");
}
}
} 最好能够分析一下全部的解答思路 展开
2个回答
展开全部
这样应该不对吧,应该是假设哪些人说的话是真话才行的.
#include<stdio.h>
int main()
{
int i,j,a[4];
for(i=0;i<4;i++) /*假定只有第i个人为窃贼*/
{
for(j=0;j<4;j++) /*将第i个人设置为1表示窃贼,其余为0*/
if(j==i)a[j]=1;//上面上循环不是说了吗?假设第i人为贼啊,就把他设置成1,他就是贼了,其他的人设置成0
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>
int main()
{
int i,j,a[4];
for(i=0;i<4;i++) /*假定只有第i个人为窃贼*/
{
for(j=0;j<4;j++) /*将第i个人设置为1表示窃贼,其余为0*/
if(j==i)a[j]=1;//上面上循环不是说了吗?假设第i人为贼啊,就把他设置成1,他就是贼了,其他的人设置成0
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");
}
}
}
追问
不用假设哪个说的是真话 因为前面三个人说的都是X偷了,O没偷; 那么也就是说,如果他说的是真话,就的确是X偷了;是假话,就一定是O偷了。于是,这变成了一个简单的数学问题,那就是:乙和丁中有一个人是小偷,乙和丙中有一个人是小偷,乙和甲中有一个人是小偷→乙一定是小偷,关键就是用程序表述这样一个推理过程。
追答
他这里好像是默认了小偷是说假话的,不是小偷的是说真话的.按照一般的情况吧,不是小偷的人没有必要说假话.我刚开始也是想假设哪个说假话的,后来发现你的程序思路和我的不一样,就按你的做了
展开全部
for(j=0;j<4;j++) /*将第i个人设置为1表示窃贼,其余为0*/
if(j==i)a[j]=1;_____________就是这个地方不明白,为什么??
else a[j]=0;
你这里写的很明确 设置第i个人为盗贼
也就是假如: i=0 j=0 那么a[0]=1 是盗贼 a[1~3] =0 都不是盗贼
i=1 j=1 那么a[1]=1 是盗贼 ,a[0]=0 a[2~3] =0 都不是盗贼
i=2 j=2 那么a[2]=1....
i=3 j=3 那么a[3]=1...
相当于数据初始化
下面的判读条件就是根据B+D=1;B+C=1;A+B=1;A+B+C+D=1。 这个来做条件的!
不明白追问吧
if(j==i)a[j]=1;_____________就是这个地方不明白,为什么??
else a[j]=0;
你这里写的很明确 设置第i个人为盗贼
也就是假如: i=0 j=0 那么a[0]=1 是盗贼 a[1~3] =0 都不是盗贼
i=1 j=1 那么a[1]=1 是盗贼 ,a[0]=0 a[2~3] =0 都不是盗贼
i=2 j=2 那么a[2]=1....
i=3 j=3 那么a[3]=1...
相当于数据初始化
下面的判读条件就是根据B+D=1;B+C=1;A+B=1;A+B+C+D=1。 这个来做条件的!
不明白追问吧
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询