刑侦科推理试题代码

造冰箱的大熊猫@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 

 

posted @ 2018-12-15 12:48  造冰箱的大熊猫  阅读(340)  评论(0编辑  收藏  举报