1. 程式人生 > >刑偵科推理試題程式碼

刑偵科推理試題程式碼

造冰箱的大熊貓@cnblogs 2018/12/15

 

年初時候江蘇網警在微博上釋出的刑偵科推理試題(試題見下圖),當時是手工推導的(推導過程見這裡),今天寫了一段程式碼搜尋答案

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 
  4 void main()
  5 {
  6   unsigned int  ans_long;
  7   unsigned char ans[10];
  8   unsigned int  ans_cnt;
  9   unsigned int
cnt[4], cnt_minpos, cnt_maxpos; 10 unsigned int i, j; 11 12 for ( ans_long = 0, ans_cnt = 0 ; ans_long < 0x100000 ; ans_long++ ) { 13 //////////////////////////////////////////////////////////// 14 // 產生答案 15 for ( i = 0, j = ans_long ; i < 10 ; i++ ) { 16 ans[i] = j & 3; 17 j = j >> 2; 18 } 19 20 ////////////////////////////////////////////////////////////
21 // 檢查答案 22 // 23 // ans[i]對應問題Q(i+1) 24 // ans[i]=0~3,對應答案A~D 25 26 // Q1 27 28 // Q2 29 if ( ans[4] != ( ( ans[1] + 2 ) % 4 ) ) 30 continue; 31 32 // Q3 33 if ( !( \ 34 ( ans[2]==0 && ans[1]!=0 && ans[3]!=0 && ans[5
]!=0 ) || \ 35 ( ans[2]==1 && ans[1]!=1 && ans[2]!=1 && ans[3]!=1 ) || \ 36 ( ans[2]==2 && ans[2]!=2 && ans[3]!=2 && ans[5]!=2 ) || \ 37 ( ans[2]==3 && ans[1]!=3 && ans[2]!=3 && ans[5]!=3 ) \ 38 ) ) 39 continue; 40 41 // Q4 42 if ( !( \ 43 ( ans[3]==0 && ans[0]==ans[4] ) || \ 44 ( ans[3]==1 && ans[1]==ans[6] ) || \ 45 ( ans[3]==2 && ans[0]==ans[8] ) || \ 46 ( ans[3]==3 && ans[5]==ans[9] ) \ 47 ) ) 48 continue; 49 50 // Q5 51 if ( !( \ 52 ( ans[4]==0 && ans[7]==0 ) || \ 53 ( ans[4]==1 && ans[3]==1 ) || \ 54 ( ans[4]==2 && ans[8]==2 ) || \ 55 ( ans[4]==3 && ans[6]==3 ) \ 56 ) ) 57 continue; 58 59 // Q6 60 if ( !( \ 61 ( ans[5]==0 && ans[1]==ans[7] && ans[3]==ans[7] ) || \ 62 ( ans[5]==1 && ans[0]==ans[7] && ans[5]==ans[7] ) || \ 63 ( ans[5]==2 && ans[2]==ans[7] && ans[9]==ans[7] ) || \ 64 ( ans[5]==3 && ans[3]==ans[7] && ans[8]==ans[7] ) \ 65 ) ) 66 continue; 67 68 // Q7 69 for ( i = 0 ; i < 4 ; i++ ) 70 cnt[i] = 0; 71 72 for ( i = 0, cnt_minpos = 0, cnt_maxpos = 0 ; i < 10 ; i++ ) { 73 j = ans[i]; 74 75 cnt[j]++; 76 77 if ( cnt[cnt_minpos] > cnt[j] ) 78 cnt_minpos = j; 79 80 if ( cnt[cnt_maxpos] < cnt[j] ) 81 cnt_maxpos = j; 82 } 83 84 if ( ( 2 - ans[6] < 0 ? 6 - ans[6] : 2 - ans[6] ) != cnt_minpos ) 85 continue; 86 87 // Q8 88 if ( !( \ 89 ( ans[7]==0 && abs( ans[0] - ans[6] )!=1 ) || \ 90 ( ans[7]==1 && abs( ans[0] - ans[4] )!=1 ) || \ 91 ( ans[7]==2 && abs( ans[0] - ans[1] )!=1 ) || \ 92 ( ans[7]==3 && abs( ans[0] - ans[9] )!=1 ) \ 93 ) ) 94 continue; 95 96 // Q9 97 if ( !( \ 98 ( ans[8]==0 && ( (ans[0]==ans[5]) ^ (ans[0]==ans[4]) ) ) || \ 99 ( ans[8]==1 && ( (ans[0]==ans[5]) ^ (ans[9]==ans[4]) ) ) || \ 100 ( ans[8]==2 && ( (ans[0]==ans[5]) ^ (ans[1]==ans[4]) ) ) || \ 101 ( ans[8]==3 && ( (ans[0]==ans[5]) ^ (ans[8]==ans[4]) ) ) \ 102 ) ) 103 continue; 104 105 // Q10 106 if ( !( \ 107 ( ans[9]==0 && ( cnt[cnt_maxpos] - cnt[cnt_minpos] )==3 ) || \ 108 ( ans[9]==1 && ( cnt[cnt_maxpos] - cnt[cnt_minpos] )==2 ) || \ 109 ( ans[9]==2 && ( cnt[cnt_maxpos] - cnt[cnt_minpos] )==4 ) || \ 110 ( ans[9]==3 && ( cnt[cnt_maxpos] - cnt[cnt_minpos] )==1 ) \ 111 ) ) 112 continue; 113 114 //////////////////////////////////////////////////////////// 115 // 列印答案 116 printf ( "%d: ", ++ans_cnt ); 117 for ( i = 0 ; i < 10 ; i++ ) 118 printf ( "%c ", 'A'+ans[i] ); 119 printf ( "\n" ); 120 } 121 }

執行結果為

1: B C A C A C D A B A