zoukankan      html  css  js  c++  java
  • 刑侦科推理试题代码

    造冰箱的大熊猫@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 ( "
    " );    
    120   }
    121 }

    运行结果为

    1: B C A C A C D A B A 
  • 相关阅读:
    跟我一起在Win10中用VMware安装Ubuntu
    跟我一起安装vmware
    关于vue项目报错:this relative module was not found
    【error】vue-style-loader didn't discriminate between server and client
    [Vue warn]: Error in beforeCreate hook: "Error: Cannot find module './index.vue?vue&type=style&index=0&lang=scss&'"
    JavaScript数据可视化编程书籍上面的例子(flotr2)
    ExecuteNonQuery和ExecuteScalar的区别
    Datatable添加数据,提示该行已经属于另一个表的解决方法
    利用反射动态调用类成员
    c#用picturebox显示多页TIF
  • 原文地址:https://www.cnblogs.com/pandabang/p/10123010.html
Copyright © 2011-2022 走看看