答案://罪犯不一定只有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;
}
其他:这样要是题目变了,人数变了,哪不得重新写代码,看了都头晕
用集合运算算法可以适应大多数情况
可以看出 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....就行了 S首先说:我也不知道a和b的值.就是说他光看和也推断不出值,后面又说:但//如果上面两段代码的任意一个只有一种方法也就是一眼就能看 //出来那就
上一个:main() { int a='A',b; char c=97; b=c-32; printf("%d%c\n",b,b); printf("%d%c\n",a,,a); } 65 A 65A
下一个:C语言编出来的EXE怎么输入两个数