关于2018年刑侦科推理题C求解

题目和手工求解

考虑到 4的10次方等于2的20次方,所以总的计算量不是很大,我们可以采用遍历的方式求解,如下

#include<stdio.h>
#include<stdlib.h>
#include <time.h>
#define max(a,b)(a>b?a:b)
#define min(a,b)(a<b?a:b)
#define ANSWERLENGTH 10
struct twoint {
int a1;
int a2;
};

int main(){
char s[ANSWERLENGTH]; //定义10个答案数组
char answer[4] = {'a','b','c','d'}; //每个题目的4个答案
int a,b,c,d =0; //定义每个答案的计数 初始化为0
int answer10[4] = {3,2,4,1}; //第10题题目答案
int answer9[4] = {6,10,2,9}; //第9题题目答案
int answer8[4] = {7,5,2,10};//第8题题目答案
char answer7[4] = {'c','b','a','d'};//第7题题目答案
struct twoint answer6[4] = {{2,4},{1,6},{3,10},{5,9}};//第6题题目答案
int answer5[4] = {8,4,9,7};//第5题题目答案
struct twoint answer4[4] = {{1,5},{2,7},{1,9},{6,10}};//第4题题目答案
char answer2[4] = {'c','b','a','d'};//第2题题目答案

clock_t t;
t = clock();//调用前时间

for(int i1=0; i1< 4; i1++)
for(int i2=0; i2< 4; i2++)
for(int i3=0; i3< 4; i3++)
for(int i4=0; i4< 4; i4++)
for(int i5=0; i5< 4; i5++)
for(int i6=0; i6< 4; i6++)
for(int i7=0; i7< 4; i7++)
for(int i8=0; i8< 4; i8++)
for(int i9=0; i9< 4; i9++)
for(int i10=0; i10< 4; i10++)
{
s[0] = answer[i1];
s[1] = answer[i2];
s[2] = answer[i3];
s[3] = answer[i4];
s[4] = answer[i5];
s[5] = answer[i6];
s[6] = answer[i7];
s[7] = answer[i8];
s[8] = answer[i9];
s[9] = answer[i10];
//10
a = 0;b = 0;c = 0;d = 0;
for(int j=0;j<ANSWERLENGTH;j++)
{
switch(s[j])
{
case 'a' : a++;break;
case 'b' : b++;break;
case 'c' : c++;break;
case 'd' : d++;break;
}
}
int maxvalue = max( max(a,b),max(c,d));
int minvalue = min( min(a,b),min(c,d));
int temp = maxvalue - minvalue;
if(temp != answer10[i10]) continue;
//printf("pass10\n");

//9
int tempInt = answer9[i9];
if ( answer[i1] == answer[i6] ){
if(s[tempInt - 1] == answer[i5]) continue;
}else{
if(s[tempInt - 1] != answer[i5]) continue;
}
//printf("pass9\n");

//8
int a8 = answer8[i8];
int diffValue = max(s[a8 -1],answer[i1]) - min(s[a8 -1],answer[i1]);
if(diffValue < 2) continue;
//printf("pass8\n");

//7
char lessChar ;
int lessCount = 0;
if( a == minvalue) { lessChar = 'a'; lessCount++; }
if( b == minvalue) { lessChar = 'b'; lessCount++; }
if( c == minvalue) { lessChar = 'c'; lessCount++; }
if( d == minvalue) { lessChar = 'd'; lessCount++; }
if(lessCount > 1) continue;
if(lessChar != answer7[i7]) continue;
//printf("pass7\n");

//6 s[5] = answer[i6];
struct twoint a6 = answer6[i6];
if ( ( s[7] != s[a6.a1-1]) || ( s[7] != s[a6.a2-1]) ) continue;
//printf("pass6\n");

//5
int a5 = answer5[i5];
if( s[a5-1] != answer[i5] ) continue;
//printf("pass5\n");

//4
struct twoint a4 = answer4[i4];
if( s[a4.a1-1] != s[a4.a2-1] ) continue;
//printf("pass4\n");

//3
int diffCount = 0;
if(s[2] != s[1] ) diffCount++;
if(s[3] != s[1] && s[3] != s[2] ) diffCount++;
if(s[5] != s[1] && s[5] != s[2] && s[5] != s[3]) diffCount++;
if(diffCount > 1) continue;
//printf("pass3\n");

//2
if ( answer2[i2] != answer[i5] ) continue;
//printf("pass2\n");

//1
t = clock() - t;
printf("time=%lf s\n",((float) t)/ CLOCKS_PER_SEC);

//get result
printf("result:");
for(int j=0;j<ANSWERLENGTH;j++)
{
printf("%c",s[j]);
}
printf("\n");
}
return 0;
}

posted on 2020-07-22 16:43  子虚乌有  阅读(285)  评论(0)    收藏  举报