C语言 解决逻辑推理问题:我已经写出了代码,请帮我修正一下。谢谢
问题:某地刑侦大队对涉及六个嫌疑人的一桩疑案进行分析:(1)A、B至少有一人作案;(2)A、E、F三人中至少有两人参与作案;(3)A、D不可能是同案犯;(4)B、C或同时...
问题:某地刑侦大队对涉及六个嫌疑人的一桩疑案进行分析:
(1) A 、 B 至少有一人作案;
(2)A 、 E 、 F 三人中至少有两人参与作案;
(3)A 、 D 不可能是同案犯;
(4)B 、 C 或同时作案,或与本案无关;
(5) C 、 D 中有且仅有一人作案;
(6)如果 D 没有参与作案,则 E 也不可能参与作案。
试编一程序,将作案人找出来。
输出格式为(以下结果不是最终答案):
A:不是罪犯
B:是罪犯
C:是罪犯
D:不是罪犯
E:不是罪犯
F:是罪犯
代码:
#include <stdio.h>
int main()
{
int i,j,k;
for(i=0;i<=3;i++)
{for(j=i+1;j<=4;j++)
{for(k=j+1;k<=5;k++)
{if(((i==0)+(j==1)>=1)+((i==0)+(j==4)+(k==5)>=2)+((i==0)+(j==3||k==3)!=2)+((i==1||j==1)+(i==2||j==2||k==2)!=1)+((i==2||j==2||k==2)+(i==3||j==3|k==3)==1)+!((i!=3||j!=3||k!=3)&&(j==4||k==4))==6)
{printf("%c%c%c:是罪犯\n", 'A'+i,'A'+j,'A'+k);
break;}}break;}break;}
return 0;
}
其中所设的i,j,k分别代表三个嫌疑犯,并且将A——F六个字母数字化。A对应0,B对应的,依次类推。 展开
(1) A 、 B 至少有一人作案;
(2)A 、 E 、 F 三人中至少有两人参与作案;
(3)A 、 D 不可能是同案犯;
(4)B 、 C 或同时作案,或与本案无关;
(5) C 、 D 中有且仅有一人作案;
(6)如果 D 没有参与作案,则 E 也不可能参与作案。
试编一程序,将作案人找出来。
输出格式为(以下结果不是最终答案):
A:不是罪犯
B:是罪犯
C:是罪犯
D:不是罪犯
E:不是罪犯
F:是罪犯
代码:
#include <stdio.h>
int main()
{
int i,j,k;
for(i=0;i<=3;i++)
{for(j=i+1;j<=4;j++)
{for(k=j+1;k<=5;k++)
{if(((i==0)+(j==1)>=1)+((i==0)+(j==4)+(k==5)>=2)+((i==0)+(j==3||k==3)!=2)+((i==1||j==1)+(i==2||j==2||k==2)!=1)+((i==2||j==2||k==2)+(i==3||j==3|k==3)==1)+!((i!=3||j!=3||k!=3)&&(j==4||k==4))==6)
{printf("%c%c%c:是罪犯\n", 'A'+i,'A'+j,'A'+k);
break;}}break;}break;}
return 0;
}
其中所设的i,j,k分别代表三个嫌疑犯,并且将A——F六个字母数字化。A对应0,B对应的,依次类推。 展开
展开全部
//罪犯不一定只有3个人,所以你的代码框架有点问题,直接帮你大换血了。
//不太好编辑,可能看起来有点乱
#include <stdio.h>
int main()
{
int A,B,C,D,E,F; //每个罪犯只有01两种情况,1是罪犯0清白
for(A=0;A<2;A++) //A
for(B=0;B<2;B++) //B
for(C=0;C<2;C++) //C
for(D=0;D<2;D++) //D
for(E=0;E<2;E++) //E
for(F=0;F<2;F++) //F
{
if( (A +B > 0 ) //AB至少一人作案
&& (A+E+F >1) //AEF至少两人作案
&& (A+D == 1) //AD不可能是同案犯
&& (B+C != 1) //BC或同案 或与本案无关
&& (C+D == 1 ) //CD只有一人作案
&& (!(!D && E))) //如果D没有参与作案,则E也不可能参与作案
{
printf("A:%s\n", A==1?"作案":"非作案" );
printf("B:%s\n", B==1?"作案":"非作案" );
printf("C:%s\n", C==1?"作案":"非作案" );
printf("D:%s\n", D==1?"作案":"非作案" );
printf("E:%s\n", E==1?"作案":"非作案" );
printf("F:%s\n", F==1?"作案":"非作案" );
break; //如果不止一个解,就不需要这个break
}
}
return 0;
}
//不太好编辑,可能看起来有点乱
#include <stdio.h>
int main()
{
int A,B,C,D,E,F; //每个罪犯只有01两种情况,1是罪犯0清白
for(A=0;A<2;A++) //A
for(B=0;B<2;B++) //B
for(C=0;C<2;C++) //C
for(D=0;D<2;D++) //D
for(E=0;E<2;E++) //E
for(F=0;F<2;F++) //F
{
if( (A +B > 0 ) //AB至少一人作案
&& (A+E+F >1) //AEF至少两人作案
&& (A+D == 1) //AD不可能是同案犯
&& (B+C != 1) //BC或同案 或与本案无关
&& (C+D == 1 ) //CD只有一人作案
&& (!(!D && E))) //如果D没有参与作案,则E也不可能参与作案
{
printf("A:%s\n", A==1?"作案":"非作案" );
printf("B:%s\n", B==1?"作案":"非作案" );
printf("C:%s\n", C==1?"作案":"非作案" );
printf("D:%s\n", D==1?"作案":"非作案" );
printf("E:%s\n", E==1?"作案":"非作案" );
printf("F:%s\n", F==1?"作案":"非作案" );
break; //如果不止一个解,就不需要这个break
}
}
return 0;
}
展开全部
这样要是题目变了,人数变了,哪不得重新写代码,看了都头晕
用集合运算算法可以适应大多数情况
可以看出 6种运算规则,先假设一个嫌疑人集合,开始为空
( 1) A 、 B 至少有一人作案; ------- 集合中加入A,B
(2)A 、 E 、 F 三人中至少有两人参与作案; -------并入A,E,F形成 C2/3 结果集N
(3)A 、 D 不可能是同案犯; -------从以上结果集中排 A/D 形成最多2*N结果集
(4)B 、 C 或同时作案,或与本案无关; ------- 排除非 BUC 结果集
(5) C 、 D 中有且仅有一人作案; ------- 排除 CUD 结果集
(6)如果 D 没有参与作案,则 E 也不可能参与作案。 -------- 排除 非D UE 结果集
输入分6次,分别输入6个规则对应的ABCDEFGHIJKLMO....就行了
用集合运算算法可以适应大多数情况
可以看出 6种运算规则,先假设一个嫌疑人集合,开始为空
( 1) A 、 B 至少有一人作案; ------- 集合中加入A,B
(2)A 、 E 、 F 三人中至少有两人参与作案; -------并入A,E,F形成 C2/3 结果集N
(3)A 、 D 不可能是同案犯; -------从以上结果集中排 A/D 形成最多2*N结果集
(4)B 、 C 或同时作案,或与本案无关; ------- 排除非 BUC 结果集
(5) C 、 D 中有且仅有一人作案; ------- 排除 CUD 结果集
(6)如果 D 没有参与作案,则 E 也不可能参与作案。 -------- 排除 非D UE 结果集
输入分6次,分别输入6个规则对应的ABCDEFGHIJKLMO....就行了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询