C语言 2018年刑侦科推理试题

        一开始见到题目的时候,我也是懵逼的,然而听说网上有人用编程解决了这个问题,我也跃跃欲试,在没有参考别人代码的情况下,思考,打草稿,写代码,调试找bug总共还是花费近5个小时,下面是题目:

C语言 2018年刑侦科推理试题_第1张图片

        除了第一个选择题,其余均可以离散化成许多对或者错的条件,只要满足了所有条件,就能得出结果,方法是最笨的暴力搜索,按照字典排序一个个尝试即可。

#include
#include
#include

//求最小值函数 
int max(int a,int b) {
	if(a>b) return a;
	return b;
}

//求最大值函数 
int min(int a,int b) {
	if(a>b) return b;
	return a;
}

//第二个选择题 
int as2(char *a) {
	if(abs(a[5]-a[2])==2) return 0;
	return 1;
}

//第三个选择题 
int as3(char *a) {
	int n=0;
	if(a[3]==65&&a[2]!=a[3]&&a[4]!=a[3]&&a[6]!=a[3]) n++;
	if(a[3]==66&&a[2]!=a[6]&&a[3]!=a[6]&&a[4]!=a[6]) n++;
	if(a[3]==67&&a[3]!=a[2]&&a[4]!=a[2]&&a[6]!=a[2]) n++;
	if(a[3]==68&&a[2]!=a[4]&&a[3]!=a[4]&&a[6]!=a[4]) n++;
	if(n==1) return 0;
	return 1;
}

//第四个选择题 
int as4(char *a) {
	int n=0;
	if(a[4]==65&&a[1]==a[5]&&a[2]!=a[7]&&a[1]!=a[9]&&a[6]!=a[10]) n++;
	if(a[4]==66&&a[1]!=a[5]&&a[2]==a[7]&&a[1]!=a[9]&&a[6]!=a[10]) n++;
	if(a[4]==67&&a[1]!=a[5]&&a[2]!=a[7]&&a[1]==a[9]&&a[6]!=a[10]) n++;
	if(a[4]==68&&a[1]!=a[5]&&a[2]!=a[7]&&a[1]!=a[9]&&a[6]==a[10]) n++;
        if(n==1) return 0;
	return 1;
}

//第五个选择题  
int as5(char *a) {
	if((a[5]==65&&a[8]==65)||(a[5]==66&&a[4]==66)||(a[5]==67&&a[9]==67)||(a[5]==68&&a[7]==68)) return 0;
	return 1;
}

//第六个选择题 
int as6(char *a) {
	int n=0;
        if(a[6]==65&&a[2]==a[8]&&a[4]==a[8]&&(a[1]!=a[8]||a[6]!=a[8])&&(a[3]!=a[8]||a[10]!=a[8])&&(a[5]!=a[8]||a[9]!=a[8])) n++;
	if(a[6]==66&&a[1]==a[8]&&a[6]==a[8]&&(a[2]!=a[8]||a[4]!=a[8])&&(a[3]!=a[8]||a[10]!=a[8])&&(a[5]!=a[8]||a[9]!=a[8])) n++;
	if(a[6]==67&&a[3]==a[8]&&a[10]==a[8]&&(a[2]!=a[8]||a[4]!=a[8])&&(a[1]!=a[8]||a[6]!=a[8])&&(a[5]!=a[8]||a[9]!=a[8])) n++;
	if(a[6]==68&&a[5]==a[8]&&a[9]==a[8]&&(a[2]!=a[8]||a[4]!=a[8])&&(a[1]!=a[8]||a[6]!=a[8])&&(a[3]!=a[8]||a[10]!=a[8])) n++;
	if(n==1) return 0;
	return 1;
}

//第七个选择题 
int as7(char *a) {
	int a1=0,b1=0,c1=0,d1=0,n=0;
	for(int i=1;i<11;i++) switch(a[i]) {
		case 'A': a1++;break;
		case 'B': b1++;break;
		case 'C': c1++;break;
		case 'D': d1++;break;
	}
	if(a[7]==65&&c1
		a[10]+=1;
		for(i=10;i>0;i--) if(a[i]==69) {
		        a[i]=65;
			a[i-1]+=1;
		}  
		if(a[0]==66) {
			printf("\n\n	计算完毕");
			break;
		}
	}
}

 

运行效果:

 

 

C语言 2018年刑侦科推理试题_第2张图片

因为打印中间过程会很耗费时间,只要注释那行打印中间过程的代码,运行时间就会从1分钟缩短到100毫秒,亲测。

显然,答案为:BCACACDABA

继续运行可以发现答案就只有这一种

你可能感兴趣的:(C/C++)