离散数学:2018年刑侦科推理试题

这里写图片描述
答案是:BCACACDABA
先来看看网上大神的做法:
这里写图片描述
这里写图片描述
下边是自己的解题过程,每一步的注释已经写得很详细,思路相对很清晰都能看懂,所以不再赘述,这里教学平台只能提交C所以需要java的自己稍作修改吧没什么区别
这里写图片描述

#include<stdio.h>

void find(char p1[10]);

char p[1048576][10];
void main(){
	int i,j;//定义所有行数,j,k是输出时的变量
	int i0,i1,i2,i3,i4,i5,i6,i7,i8,i9;//定义10个题

	//找到所有可能的情况
	for(i=0;i<1048576;){
		for(i0=0;i0<4;i0++){
			p[i+i0][0] = 'A' + i0;
			for(i1=0;i1<4;i1++){
				p[i+i1][1] = 'A' +i1;
				p[i+i1][0] = 'A' + i0;
				for(i2=0;i2<4;i2++){
					p[i+i2][2] = 'A' +i2;
					p[i+i2][1] = 'A' +i1;
					p[i+i2][0] = 'A' +i0;
					for(i3=0;i3<4;i3++){
						p[i+i3][3] = 'A' +i3;
						p[i+i3][2] = 'A' +i2;
						p[i+i3][1] = 'A' +i1;
						p[i+i3][0] = 'A' +i0;
						for(i4=0;i4<4;i4++){
							p[i+i4][4] = 'A' +i4;
							p[i+i4][3] = 'A' +i3;
							p[i+i4][2] = 'A' +i2;
							p[i+i4][1] = 'A' +i1;
							p[i+i4][0] = 'A' +i0;
							for(i5=0;i5<4;i5++){
								p[i+i5][5] = 'A' +i5;
								p[i+i5][4] = 'A' +i4;
								p[i+i5][3] = 'A' +i3;
								p[i+i5][2] = 'A' +i2;
								p[i+i5][1] = 'A' +i1;
								p[i+i5][0] = 'A' +i0;
								for(i6=0;i6<4;i6++){
									p[i+i6][6] = 'A' +i6;
									p[i+i6][5] = 'A' +i5;
									p[i+i6][4] = 'A' +i4;
									p[i+i6][3] = 'A' +i3;
									p[i+i6][2] = 'A' +i2;
									p[i+i6][1] = 'A' +i1;
									p[i+i6][0] = 'A' +i0;
									for(i7=0;i7<4;i7++){
										p[i+i7][7] = 'A' +i7;
										p[i+i7][6] = 'A' +i6;
										p[i+i7][5] = 'A' +i5;
										p[i+i7][4] = 'A' +i4;
										p[i+i7][3] = 'A' +i3;
										p[i+i7][2] = 'A' +i2;
										p[i+i7][1] = 'A' +i1;
										p[i+i7][0] = 'A' +i0;
										for(i8=0;i8<4;i8++){
											p[i+i8][8] = 'A' +i8;
											p[i+i8][7] = 'A' +i7;
											p[i+i8][6] = 'A' +i6;
											p[i+i8][5] = 'A' +i5;
											p[i+i8][4] = 'A' +i4;
											p[i+i8][3] = 'A' +i3;
											p[i+i8][2] = 'A' +i2;
											p[i+i8][1] = 'A' +i1;
											p[i+i8][0] = 'A' +i0;
											for(i9=0;i9<4;i++,i9++){
												p[i][9] = 'A' +i9;
												p[i][8] = 'A' +i8;
												p[i][7] = 'A' +i7;
												p[i][6] = 'A' +i6;
												p[i][5] = 'A' +i5;
												p[i][4] = 'A' +i4;
												p[i][3] = 'A' +i3;
												p[i][2] = 'A' +i2;
												p[i][1] = 'A' +i1;
												p[i][0] = 'A' +i0;
												//printf("i=%d\n",i);//打印i的值
											}//i9
										}//i8
									}//i7
								}//i6
							}//i5
						}//i4
					}//i3
				}//i2
			}//i1
		}//i0
	}//i

	//打印输出所有情况
	for(j=0;j<1048576;j++){
		/*for(k=0;k<10;k++){
			printf("%c",p[j][k]);
		}
		printf("\n");*/
		find(p[j]);
	}
	
}//main

//遍历每一钟情况是否符合
void find(char a[10]){
	int NumA = 0;//答案中A选项的个数
	int NumB = 0;//答案中B选项的个数
	int NumC = 0;//答案中C选项的个数
	int NumD = 0;//答案中D选项的个数
	int max,min,cha;//答案出现最多的次数和最少的次数,他们之差

	int i,j;//辅助循环的
	char c;//用来暂时接收每个题的答案
	static int k = 0;//用来看看输出的结果有多少种

	for(i=0;i<10;i++){
		c = a[i];
		if(c=='A'){
			NumA++;
		}else if(c=='B'){
			NumB++;
		}else if(c=='C'){
			NumC++;
		}else{
			NumD++;
		}
	}//for
	
	//第一题的选项直接从数组中拿不做判断

	//第二题的翻译
	if(a[4] == 'A'){//如果第五题答案是A,则第二题答案选C
		if(a[1]!='C'){
			return;
		}
	}else if(a[4] == 'B'){//如果第五题答案是B,则第二题答案选D
		if(a[1]!='D'){
			return;
		}
	}else if(a[4] == 'C'){//如果第五题答案是C,则第二题答案选A
		if(a[1]!='A'){
			return;
		}
	}else if(a[4] == 'D'){//如果第五题答案是D,则第二题答案选B
		if(a[1]!='B'){
			return;
		}
	}

	//第三题的翻译,由题意可知四个选项只会出现2个字母,三个一样的,一个不一样的,所以只需找到两个一样的和一个不一样的就行(预判错误)
	//如果两两相等,改题无答案
	if(a[1]==a[2]){//如果第二题和第三题答案相同
		if(a[2]==a[3]){//如果第三题和第四题答案相同,则这个题答案选B,第六题答案和其他不同
			if(a[2]!='B'){
				return;
			}
		}else{//如果第三题和第四题答案不相同,则这个题答案选D,第四题答案和其他不同
			if(a[3] == a[6]){
				return;
			}else{
				if(a[2]!='D'){
					return;
				}
			}
		}
	}else{//如果第二题和第三题答案不相同
		if(a[1]==a[3]){//如果第二题和第四题答案相同,则这个题答案选A,第三题答案和其他不同
			if(a[2] == a[5]){//如果第三题和第六题答案再相同,则改题无答案
				return;
			}else{
				if(a[2]!='A'){
					return;
				}
			}
		}else{//如果第二题和第四题答案不相同,则这个题答案选C,第二题答案和其他不同
			if(a[1] == a[5]){
				return;
			}else{
				if(a[2]!='C'){
					return;
				}
			}
		}//else
	}//if

	//第四题的翻译
	if(a[0]==a[4]){//如果第一题和第五题答案一样,则第四题答案应该是A
		if(a[3] != 'A'){
			return;
		}
	}else if(a[1]==a[6]){//如果第二题和第七题答案一样,则第四题答案应该是B
		if(a[3] != 'B'){
			return;
		}
	}else if(a[0]==a[8]){//如果第一题和第九题答案一样,则第四题答案应该是C
		if(a[3] != 'C'){
			return;
		}
	}else if(a[5]==a[9]){//如果第六题和第十题答案一样,则第四题答案应该是D
		if(a[3] != 'D'){
			return;
		}
	}else if(a[0]!=a[4]  && a[1]!=a[6] && a[0]!=a[8] && a[5]!=a[9]){//ABCD都不满足的情况
		return;
	}


	//第五题翻译
	if(a[4]==a[3]){//如果第五题答案和第四题相同则选B
		if(a[4]!='B'){
			return;
		}
	}
	
	if(a[4]==a[6]){//如果第五题答案和第七题相同则选D
		if(a[4]!='D'){
			return;
		}
	}
	
	if(a[4]==a[7]){//如果第五题答案和第八题相同则选A
		if(a[4]!='A'){
			return;
		}
	}
	
	if(a[4]==a[8]){//如果第五题答案和第九题相同则选C
		if(a[4]!='C'){
			return;
		}
	}
	
	if(a[4]==a[3]){//如果第五题答案和第四题不相同
		if(a[4]!='B'){
			return;
		}
	}
	
	if(a[4]!=a[6]){//如果第五题答案和第七题不相同
		if(a[4]=='D'){
			return;
		}
	}
	
	if(a[4]!=a[7]){//如果第五题答案和第八题不相同
		if(a[4]=='A'){
			return;
		}
	}
	
	if(a[4]!=a[8]){//如果第五题答案和第九题不相同
		if(a[4]=='C'){
			return;
		}
	}

	//第六题的翻译
	if(a[1]!=a[3]){
		if(a[5]=='A'){
			return;
		}
	}

	if(a[0]!=a[5]){
		if(a[5]=='B'){
			return;
		}
	}

	if(a[2]!=a[9]){
		if(a[5]=='C'){
			return;
		}
	}
	
	if(a[4]!=a[8]){
		if(a[5]=='D'){
			return;
		}
	}
	
	if(a[1]==a[3] && a[1]==a[7]){//如果第二题和第四题相等,则第六题答案选A
		if(a[5]!='A'){
			return;
		}
	}
	
	if(a[0]==a[5] && a[0]==a[7]){//如果第一题和第六题相等,则第六题答案选B
		if(a[5]!='B'){
			return;
		}
	}
	
	if(a[2]==a[9] && a[2]==a[7]){//如果第三题和第十题相等,则第六题答案选C
		if(a[5]!='C'){
			return;
		}
	}
	
	if(a[4]==a[8] && a[4]==a[7]){//如果第五题和第十题相等,则第九题答案选D
		if(a[5]!='D'){
			return;
		}
	}
	
	if(a[1]==a[3] && a[1]!=a[7]){
		if(a[5]=='A'){
			return;
		}
	}
	
	if(a[0]==a[5] && a[0]!=a[7]){
		if(a[5]=='B'){
			return;
		}
	}
	
	if(a[2]==a[9] && a[2]!=a[7]){
		if(a[5]=='C'){
			return;
		}
	}
	
	if(a[4]==a[8] && a[4]!=a[7]){
		if(a[5]=='D'){
			return;
		}
	}
	
	if(a[1]!=a[3] && a[0]!=a[5] && a[2]!=a[9] && a[4]!=a[8]){//答案ABCD都不对的情况
		return;
	}

	//第七题翻译
	if(NumA < NumB){
		if(NumA < NumC){
			if(NumA < NumD){//NumA最小,答案选C
				min = NumA;
				if(a[6]!='C'){
					return;
				}
			}else{//NumD最小,答案选D
				min = NumD;
				if(a[6]!='D'){
					return;
				}
			}
		}else{
			if(NumC < NumD){//NumC最小,答案选A
				min = NumC;
				if(a[6]!='A'){
					return;
				}
			}else{//NumD最小,答案选D
				min = NumD;
				if(a[6]!='D'){
					return;
				}
			}
		}
	}else{
		if(NumB < NumC){
			if(NumB < NumD){//NumB最小,答案选B
				min = NumB;
				if(a[6]!='B'){
					return;
				}
			}else{//NumD最小,答案选D
				min = NumD;
				if(a[6]!='D'){
					return;
				}
			}
		}else{
			if(NumC < NumD){//NumC最小,答案选A
				min = NumC;
				if(a[6]!='A'){
					return;
				}
			}else{//NumD最小,答案选D
				min = NumD;
				if(a[6]!='D'){
					return;
				}
			}
		}
	}

	//第八题翻译
	if(a[0]=='A'){//如果第一题选A,则二五七十题不能选B
		if(a[1] == 'B'){//如果第二题答案是B
			if(a[7] == a[1]){
				return;
			}
		}else if(a[4] == 'B'){//如果第五题答案是B
			if(a[7] == a[4]){
				return;
			}
		}else if(a[6] == 'B'){//如果第七题答案是B
			if(a[7] == a[6]){
				return;
			}
		}else if(a[9] == 'B'){//如果第十题答案是B
			if(a[7] == a[9]){
				return;
			}
		}
	}else if(a[0]=='B'){//如果第一题选B,则二五七十题不能选A或C
		if(a[1] == 'A' || a[1] =='C'){//如果第二题答案是A或C
			if(a[7] == a[1]){
				return;
			}
		}else if(a[4] == 'A' || a[4] =='C'){//如果第五题答案是A或C
			if(a[7] == a[4]){
				return;
			}
		}else if(a[6] == 'A' || a[6] =='C'){//如果第七题答案是A或C
			if(a[7] == a[6]){
				return;
			}
		}else if(a[9] == 'A' || a[9] =='C'){//如果第十题答案是A或C
			if(a[7] == a[9]){
				return;
			}
		}
	}else if(a[0]=='C'){//如果第一题选C,则二五七十题不能选B或D
		if(a[1] == 'B' || a[1] =='D'){//如果第二题答案是B或D
			if(a[7] == a[1]){
				return;
			}
		}else if(a[4] == 'B' || a[4] =='D'){//如果第五题答案是B或D
			if(a[7] == a[4]){
				return;
			}
		}else if(a[6] == 'B' || a[6] =='D'){//如果第七题答案是B或D
			if(a[7] == a[6]){
				return;
			}
		}else if(a[9] == 'B' || a[9] =='D'){//如果第十题答案是B或D
			if(a[7] == a[9]){
				return;
			}
		}
	}else if(a[0]=='D'){//如果第一题选D,则二五七十题不能选C
		if(a[1] == 'C'){//如果第二题答案是C
			if(a[7] == a[1]){
				return;
			}
		}else if(a[4] == 'C'){//如果第五题答案是C
			if(a[7] == a[4]){
				return;
			}
		}else if(a[6] == 'C'){//如果第七题答案是C
			if(a[7] == a[6]){
				return;
			}
		}else if(a[9] == 'C'){//如果第十题答案是C
			if(a[7] == a[9]){
				return;
			}
		}
	}


	//第九题翻译
	if(a[0]==a[5]){//如果第一题和第六题相同,则X与第五题不相同才行
		if(a[1] == a[4]){//如果第二题和第五题相等
			if(a[8] == 'C'){
				return;
			}
		}
		
		if(a[5] == a[4]){//如果第六题和第五题相等
			if(a[8] == 'A'){
				return;
			}
		}

		if(a[8] == a[4]){//如果第九题和第五题相等
			if(a[8] == 'D'){
				return;
			}
		}

		if(a[9] == a[4]){//如果第十题和第五题相等
			if(a[8] == 'B'){
				return;
			}
		}
	}else{//如果第一题和第六题不相同,则X与第五题相同才行
		if(a[1] != a[4]){//如果第二题和第五题不相等
			if(a[8] == 'C'){
				return;
			}
		}
		
		if(a[5] != a[4]){//如果第六题和第五题不相等
			if(a[8] == 'A'){
				return;
			}
		}

		if(a[8] != a[4]){//如果第九题和第五题不相等
			if(a[8] == 'D'){
				return;
			}
		}

		if(a[9] != a[4]){//如果第十题和第五题不相等
			if(a[8] == 'B'){
				return;
			}
		}
	}

	//第十题的翻译,因为第七题有了最小值,现在只需求最大值就行
	if(min==NumA){
		if(NumB > NumC){
			if(NumB >NumD){
				max = NumB;
			}else{
				max = NumD;
			}
		}else{
			if(NumC > NumD){
				max = NumC;
			}else{
				max = NumD;
			}
		}
	}else if(min==NumB){
		if(NumA > NumC){
			if(NumA >NumD){
				max = NumA;
			}else{
				max = NumD;
			}
		}else{
			if(NumC > NumD){
				max = NumC;
			}else{
				max = NumD;
			}
		}
	}else if(min==NumC){
		if(NumA > NumB){
			if(NumA >NumD){
				max = NumA;
			}else{
				max = NumD;
			}
		}else{
			if(NumB > NumD){
				max = NumB;
			}else{
				max = NumD;
			}
		}
	}else if(min==NumD){
		if(NumA > NumB){
			if(NumA >NumC){
				max = NumA;
			}else{
				max = NumC;
			}
		}else{
			if(NumB > NumC){
				max = NumB;
			}else{
				max = NumC;
			}
		}
	}

	cha = max - min;
	if(cha == 1){
		if(a[9] != 'D'){
			return;
		}
	}else if(cha == 2){
		if(a[9] != 'B'){
			return;
		}
	}else if(cha == 3){
		if(a[9] != 'A'){
			return;
		}
	}else if(cha == 4){
		if(a[9] != 'C'){
			return;
		}
	}

	//打印结果
	for(i=0;i<10;i++){
		printf("%c",a[i]);
	}

	printf("\n");
	//printf("  %d\n",++k);//这里可以看一共多少行结果

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值