1. 程式人生 > >離散數學:2018年刑偵科推理試題

離散數學: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);//這裡可以看一共多少行結果 }