离散数学:2018年刑侦科推理试题
2018-03-30 11:46
253 查看
答案是: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);//这里可以看一共多少行结果 }
相关文章推荐
- 2018年刑侦科推理试题【JavaScript解法】
- 2018年刑侦科推理试题
- 2018年刑侦科推理试题
- 网络热图——2018年刑侦科推理试题——C++求解
- 网红试题 2018年刑侦科目推理试题 的程序员解法
- 2018年刑侦科目推理试题
- Node.js力破江苏网警刑侦科推理试题
- Node.js力破江苏网警刑侦科推理试题
- 2018年刑侦推理试题解答-python
- PHP版解刑侦科推理试题...
- 【Java】2018年刑侦科推理试卷
- 2018刑侦科推理试题 穷举解法
- 西邮移动应用开发实验室2018年纳新试题
- 2018刑侦科推理试题
- 2018年金山WPSweb前端开发试题
- 2018刑侦科推理试题
- 【离散数学】第五章 一阶逻辑等值演算与推理
- 求一个字符串中最长数字串及其长度 #华为2018年春招机试题#
- <无聊>学军中学推理社2017届招新试题
- 逻辑推理试题