離散數學:2018年刑偵科推理試題
阿新 • • 發佈:2019-02-12
答案是: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);//這裡可以看一共多少行結果
}