C语言编程推理题刑警大队,C语言 2018年刑侦科推理试题

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

ad4fdbf6b67775f590f0b7b01cf90ad6.png

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

#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

if(a[7]==66&&b1

if(a[7]==67&&a1

if(a[7]==68&&d1

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;

}

}

}

运行效果:

950c0c25fa464bb1c89955fa02d0f0c4.png

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

显然,答案为:BCACACDABA

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值