一开始见到题目的时候,我也是懵逼的,然而听说网上有人用编程解决了这个问题,我也跃跃欲试,在没有参考别人代码的情况下,思考,打草稿,写代码,调试找bug总共还是花费近5个小时,下面是题目:
除了第一个选择题,其余均可以离散化成许多对或者错的条件,只要满足了所有条件,就能得出结果,方法是最笨的暴力搜索,按照字典排序一个个尝试即可。
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
//求最小值函数
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<a1&&c1<b1&&c1<d1) n++;
if(a[7]==66&&b1<a1&&b1<c1&&b1<d1) n++;
if(a[7]==67&&a1<b1&&a1<c1&&a1<d1) n++;
if(a[7]==68&&d1<a1&&d1<b1&&d1<c1) n++;
if(n==1) return 0;
return 1;
}
//第八个选择题
int as8(char *a) {
int n=0;
if(a[8]==65&&(abs(a[7]-a[1])!=1)&&(abs(a[5]-a[1])==1)&&(abs(a[2]-a[1])==1)&&(abs(a[10]-a[1])==1)) n++;
if(a[8]==66&&(abs(a[7]-a[1])==1)&&(abs(a[5]-a[1])!=1)&&(abs(a[2]-a[1])==1)&&(abs(a[10]-a[1])==1)) n++;
if(a[8]==67&&(abs(a[7]-a[1])==1)&&(abs(a[5]-a[1])==1)&&(abs(a[2]-a[1])!=1)&&(abs(a[10]-a[1])==1)) n++;
if(a[8]==68&&(abs(a[7]-a[1])==1)&&(abs(a[5]-a[1])==1)&&(abs(a[2]-a[1])==1)&&(abs(a[10]-a[1])!=1)) n++;
if(n==1) return 0;
return 1;
}
//第九个选择题
int as9(char *a) {
int n=0;
if(a[9]==65&&((a[1]==a[6]&&a[6]!=a[5])||(a[1]!=a[6]&&a[6]==a[5]))) n++;
if(a[9]==66&&((a[1]==a[6]&&a[10]!=a[5])||(a[1]!=a[6]&&a[10]==a[5]))) n++;
if(a[9]==67&&((a[1]==a[6]&&a[2]!=a[5])||(a[1]!=a[6]&&a[2]==a[5]))) n++;
if(a[9]==68&&((a[1]==a[6]&&a[9]!=a[5])||(a[1]!=a[6]&&a[9]==a[5]))) n++;
if(n==1) return 0;
return 1;
}
//第十个选择题
int as10(char *a) {
int a1=0,b1=0,c1=0,d1=0,n=0,s1,s2,s3,s4,s5,s6;
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;
}
s1=min(a1,b1);
s2=min(c1,d1);
s3=max(a1,b1);
s4=max(c1,d1);
s5=min(s1,s2);
s6=max(s3,s4);
s5=s6-s5;
if((a[10]==65&&s5==3)||(a[10]==66&&s5==2)||(a[10]==67&&s5==4)||(a[10]==68&&s5==1)) return 0;
return 1;
}
int main() {
char a[11];
int s,i,m=0;
float n;
for(i=0;i<11;i++) a[i]='A';
while(1) {
s=as2(a)+as3(a)+as4(a)+as5(a)+as6(a)+as7(a)+as8(a)+as9(a)+as10(a); //函数符合返回0,当s==0时,全都符合
m++;
printf("第%d次: %c %c %c %c %c %c %c %c %c %c\n",m,a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],a[10]);
if(s==0) {
printf("正确!\n");
system("pause"); //暂停一下看答案
}
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;
}
}
}
运行效果:
因为打印中间过程会很耗费时间,只要注释那行打印中间过程的代码,运行时间就会从1分钟缩短到100毫秒,亲测。
显然,答案为:BCACACDABA
继续运行可以发现答案就只有这一种