造冰箱的大熊猫@cnblogs 2018/12/15
年初时候刑侦科推理试题(试题见下图),当时是手工推导的(),今天写了一段代码搜索答案
1 #include2 #include 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 // Q10106 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