当前位置:编程学习 > C/C++ >>

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对应的,依次类推。
答案://罪犯不一定只有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怎么输入两个数

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,