您的位置:首页 > 其它

离散数学:2018年刑侦科推理试题

2018-03-30 11:46 253 查看


答案是:BCACACDABA

先来看看网上大神的做法:





下边是自己的解题过程,每一步的注释已经写得很详细,思路相对很清晰都能看懂,所以不再赘述,这里教学平台只能提交C所以需要java的自己稍作修改吧没什么区别

#include<stdio.h>

void find(char p1[10]);

char p[1048576][10];
void main(){
int i,j;//定义所有行数,j,k是输出时的变量
int i0,i1,i2,i3,i4,i5,i6,i7,i8,i9;//定义10个题

//找到所有可能的情况
for(i=0;i<1048576;){
for(i0=0;i0<4;i0++){
p[i+i0][0] = 'A' + i0;
for(i1=0;i1<4;i1++){
p[i+i1][1] = 'A' +i1;
p[i+i1][0] = 'A' + i0;
for(i2=0;i2<4;i2++){
p[i+i2][2] = 'A' +i2;
p[i+i2][1] = 'A' +i1;
p[i+i2][0] = 'A' +i0;
for(i3=0;i3<4;i3++){
p[i+i3][3] = 'A' +i3;
p[i+i3][2] = 'A' +i2;
p[i+i3][1] = 'A' +i1;
p[i+i3][0] = 'A' +i0;
for(i4=0;i4<4;i4++){
p[i+i4][4] = 'A' +i4;
p[i+i4][3] = 'A' +i3;
p[i+i4][2] = 'A' +i2;
p[i+i4][1] = 'A' +i1;
p[i+i4][0] = 'A' +i0;
for(i5=0;i5<4;i5++){
p[i+i5][5] = 'A' +i5;
p[i+i5][4] = 'A' +i4;
p[i+i5][3] = 'A' +i3;
p[i+i5][2] = 'A' +i2;
p[i+i5][1] = 'A' +i1;
p[i+i5][0] = 'A' +i0;
for(i6=0;i6<4;i6++){
p[i+i6][6] = 'A' +i6;
p[i+i6][5] = 'A' +i5;
p[i+i6][4] = 'A' +i4;
p[i+i6][3] = 'A' +i3;
p[i+i6][2] = 'A' +i2;
p[i+i6][1] = 'A' +i1;
p[i+i6][0] = 'A' +i0;
for(i7=0;i7<4;i7++){
p[i+i7][7] = 'A' +i7;
p[i+i7][6] = 'A' +i6;
p[i+i7][5] = 'A' +i5;
p[i+i7][4] = 'A' +i4;
p[i+i7][3] = 'A' +i3;
p[i+i7][2] = 'A' +i2;
p[i+i7][1] = 'A' +i1;
p[i+i7][0] = 'A' +i0;
for(i8=0;i8<4;i8++){
p[i+i8][8] = 'A' +i8;
p[i+i8][7] = 'A' +i7;
p[i+i8][6] = 'A' +i6;
p[i+i8][5] = 'A' +i5;
p[i+i8][4] = 'A' +i4;
p[i+i8][3] = 'A' +i3;
p[i+i8][2] = 'A' +i2;
p[i+i8][1] = 'A' +i1;
p[i+i8][0] = 'A' +i0;
for(i9=0;i9<4;i++,i9++){
p[i][9] = 'A' +i9;
p[i][8] = 'A' +i8;
p[i][7] = 'A' +i7;
p[i][6] = 'A' +i6;
p[i][5] = 'A' +i5;
p[i][4] = 'A' +i4;
p[i][3] = 'A' +i3;
p[i][2] = 'A' +i2;
p[i][1] = 'A' +i1;
p[i][0] = 'A' +i0;
//printf("i=%d\n",i);//打印i的值
}//i9
}//i8
}//i7
}//i6
}//i5
}//i4
}//i3
}//i2
}//i1
}//i0
}//i

//打印输出所有情况
for(j=0;j<1048576;j++){
/*for(k=0;k<10;k++){
printf("%c",p[j][k]);
}
printf("\n");*/
find(p[j]);
}

}//main

//遍历每一钟情况是否符合
void find(char a[10]){
int NumA = 0;//答案中A选项的个数
int NumB = 0;//答案中B选项的个数
int NumC = 0;//答案中C选项的个数
int NumD = 0;//答案中D选项的个数
int max,min,cha;//答案出现最多的次数和最少的次数,他们之差

int i,j;//辅助循环的
char c;//用来暂时接收每个题的答案
static int k = 0;//用来看看输出的结果有多少种

for(i=0;i<10;i++){
c = a[i];
if(c=='A'){
NumA++;
}else if(c=='B'){
NumB++;
}else if(c=='C'){
NumC++;
}else{
NumD++;
}
}//for

//第一题的选项直接从数组中拿不做判断

//第二题的翻译
if(a[4] == 'A'){//如果第五题答案是A,则第二题答案选C
if(a[1]!='C'){
return;
}
}else if(a[4] == 'B'){//如果第五题答案是B,则第二题答案选D
if(a[1]!='D'){
return;
}
}else if(a[4] == 'C'){//如果第五题答案是C,则第二题答案选A
if(a[1]!='A'){
return;
}
}else if(a[4] == 'D'){//如果第五题答案是D,则第二题答案选B
if(a[1]!='B'){
return;
}
}

//第三题的翻译,由题意可知四个选项只会出现2个字母,三个一样的,一个不一样的,所以只需找到两个一样的和一个不一样的就行(预判错误)
//如果两两相等,改题无答案
if(a[1]==a[2]){//如果第二题和第三题答案相同
if(a[2]==a[3]){//如果第三题和第四题答案相同,则这个题答案选B,第六题答案和其他不同
if(a[2]!='B'){
return;
}
}else{//如果第三题和第四题答案不相同,则这个题答案选D,第四题答案和其他不同
if(a[3] == a[6]){
return;
}else{
if(a[2]!='D'){
return;
}
}
}
}else{//如果第二题和第三题答案不相同
if(a[1]==a[3]){//如果第二题和第四题答案相同,则这个题答案选A,第三题答案和其他不同
if(a[2] == a[5]){//如果第三题和第六题答案再相同,则改题无答案
return;
}else{
if(a[2]!='A'){
return;
}
}
}else{//如果第二题和第四题答案不相同,则这个题答案选C,第二题答案和其他不同
if(a[1] == a[5]){
return;
}else{
if(a[2]!='C'){
return;
}
}
}//else
}//if

//第四题的翻译
if(a[0]==a[4]){//如果第一题和第五题答案一样,则第四题答案应该是A
if(a[3] != 'A'){
return;
}
}else if(a[1]==a[6]){//如果第二题和第七题答案一样,则第四题答案应该是B
if(a[3] != 'B'){
return;
}
}else if(a[0]==a[8]){//如果第一题和第九题答案一样,则第四题答案应该是C
if(a[3] != 'C'){
return;
}
}else if(a[5]==a[9]){//如果第六题和第十题答案一样,则第四题答案应该是D
if(a[3] != 'D'){
return;
}
}else if(a[0]!=a[4]  && a[1]!=a[6] && a[0]!=a[8] && a[5]!=a[9]){//ABCD都不满足的情况
return;
}

//第五题翻译
if(a[4]==a[3]){//如果第五题答案和第四题相同则选B
if(a[4]!='B'){
return;
}
}

if(a[4]==a[6]){//如果第五题答案和第七题相同则选D
if(a[4]!='D'){
return;
}
}

if(a[4]==a[7]){//如果第五题答案和第八题相同则选A
if(a[4]!='A'){
return;
}
}

if(a[4]==a[8]){//如果第五题答案和第九题相同则选C
if(a[4]!='C'){
return;
}
}

if(a[4]==a[3]){//如果第五题答案和第四题不相同
if(a[4]!='B'){
return;
}
}

if(a[4]!=a[6]){//如果第五题答案和第七题不相同
if(a[4]=='D'){
return;
}
}

if(a[4]!=a[7]){//如果第五题答案和第八题不相同
if(a[4]=='A'){
return;
}
}

if(a[4]!=a[8]){//如果第五题答案和第九题不相同
if(a[4]=='C'){
return;
}
}

//第六题的翻译
if(a[1]!=a[3]){
if(a[5]=='A'){
return;
}
}

if(a[0]!=a[5]){
if(a[5]=='B'){
return;
}
}

if(a[2]!=a[9]){
if(a[5]=='C'){
return;
}
}

if(a[4]!=a[8]){
if(a[5]=='D'){
return;
}
}

if(a[1]==a[3] && a[1]==a[7]){//如果第二题和第四题相等,则第六题答案选A
if(a[5]!='A'){
return;
}
}

if(a[0]==a[5] && a[0]==a[7]){//如果第一题和第六题相等,则第六题答案选B
if(a[5]!='B'){
return;
}
}

if(a[2]==a[9] && a[2]==a[7]){//如果第三题和第十题相等,则第六题答案选C
if(a[5]!='C'){
return;
}
}

if(a[4]==a[8] && a[4]==a[7]){//如果第五题和第十题相等,则第九题答案选D
if(a[5]!='D'){
return;
}
}

if(a[1]==a[3] && a[1]!=a[7]){
if(a[5]=='A'){
return;
}
}

if(a[0]==a[5] && a[0]!=a[7]){
if(a[5]=='B'){
return;
}
}

if(a[2]==a[9] && a[2]!=a[7]){
if(a[5]=='C'){
return;
}
}

if(a[4]==a[8] && a[4]!=a[7]){
if(a[5]=='D'){
return;
}
}

if(a[1]!=a[3] && a[0]!=a[5] && a[2]!=a[9] && a[4]!=a[8]){//答案ABCD都不对的情况
return;
}

//第七题翻译
if(NumA < NumB){
if(NumA < NumC){
if(NumA < NumD){//NumA最小,答案选C
min = NumA;
if(a[6]!='C'){
return;
}
}else{//NumD最小,答案选D
min = NumD;
if(a[6]!='D'){
return;
}
}
}else{
if(NumC < NumD){//NumC最小,答案选A
min = NumC;
if(a[6]!='A'){
return;
}
}else{//NumD最小,答案选D
min = NumD;
if(a[6]!='D'){
return;
}
}
}
}else{
if(NumB < NumC){
if(NumB < NumD){//NumB最小,答案选B
min = NumB;
if(a[6]!='B'){
return;
}
}else{//NumD最小,答案选D
min = NumD;
if(a[6]!='D'){
return;
}
}
}else{
if(NumC < NumD){//NumC最小,答案选A
min = NumC;
if(a[6]!='A'){
return;
}
}else{//NumD最小,答案选D
min = NumD;
if(a[6]!='D'){
return;
}
}
}
}

//第八题翻译
if(a[0]=='A'){//如果第一题选A,则二五七十题不能选B
if(a[1] == 'B'){//如果第二题答案是B
if(a[7] == a[1]){
return;
}
}else if(a[4] == 'B'){//如果第五题答案是B
if(a[7] == a[4]){
return;
}
}else if(a[6] == 'B'){//如果第七题答案是B
if(a[7] == a[6]){
return;
}
}else if(a[9] == 'B'){//如果第十题答案是B
if(a[7] == a[9]){
return;
}
}
}else if(a[0]=='B'){//如果第一题选B,则二五七十题不能选A或C
if(a[1] == 'A' || a[1] =='C'){//如果第二题答案是A或C
if(a[7] == a[1]){
return;
}
}else if(a[4] == 'A' || a[4] =='C'){//如果第五题答案是A或C
if(a[7] == a[4]){
return;
}
}else if(a[6] == 'A' || a[6] =='C'){//如果第七题答案是A或C
if(a[7] == a[6]){
return;
}
}else if(a[9] == 'A' || a[9] =='C'){//如果第十题答案是A或C
if(a[7] == a[9]){
return;
}
}
}else if(a[0]=='C'){//如果第一题选C,则二五七十题不能选B或D
if(a[1] == 'B' || a[1] =='D'){//如果第二题答案是B或D
if(a[7] == a[1]){
return;
}
}else if(a[4] == 'B' || a[4] =='D'){//如果第五题答案是B或D
if(a[7] == a[4]){
return;
}
}else if(a[6] == 'B' || a[6] =='D'){//如果第七题答案是B或D
if(a[7] == a[6]){
return;
}
}else if(a[9] == 'B' || a[9] =='D'){//如果第十题答案是B或D
if(a[7] == a[9]){
return;
}
}
}else if(a[0]=='D'){//如果第一题选D,则二五七十题不能选C
if(a[1] == 'C'){//如果第二题答案是C
if(a[7] == a[1]){
return;
}
}else if(a[4] == 'C'){//如果第五题答案是C
if(a[7] == a[4]){
return;
}
}else if(a[6] == 'C'){//如果第七题答案是C
if(a[7] == a[6]){
return;
}
}else if(a[9] == 'C'){//如果第十题答案是C
if(a[7] == a[9]){
return;
}
}
}

//第九题翻译
if(a[0]==a[5]){//如果第一题和第六题相同,则X与第五题不相同才行
if(a[1] == a[4]){//如果第二题和第五题相等
if(a[8] == 'C'){
return;
}
}

if(a[5] == a[4]){//如果第六题和第五题相等
if(a[8] == 'A'){
return;
}
}

if(a[8] == a[4]){//如果第九题和第五题相等
if(a[8] == 'D'){
return;
}
}

if(a[9] == a[4]){//如果第十题和第五题相等
if(a[8] == 'B'){
return;
}
}
}else{//如果第一题和第六题不相同,则X与第五题相同才行
if(a[1] != a[4]){//如果第二题和第五题不相等
if(a[8] == 'C'){
return;
}
}

if(a[5] != a[4]){//如果第六题和第五题不相等
if(a[8] == 'A'){
return;
}
}

if(a[8] != a[4]){//如果第九题和第五题不相等
if(a[8] == 'D'){
return;
}
}

if(a[9] != a[4]){//如果第十题和第五题不相等
if(a[8] == 'B'){
return;
}
}
}

//第十题的翻译,因为第七题有了最小值,现在只需求最大值就行
if(min==NumA){
if(NumB > NumC){
if(NumB >NumD){
max = NumB;
}else{
max = NumD;
}
}else{
if(NumC > NumD){
max = NumC;
}else{
max = NumD;
}
}
}else if(min==NumB){
if(NumA > NumC){
if(NumA >NumD){
max = NumA;
}else{
max = NumD;
}
}else{
if(NumC > NumD){
max = NumC;
}else{
max = NumD;
}
}
}else if(min==NumC){
if(NumA > NumB){
if(NumA >NumD){
max = NumA;
}else{
max = NumD;
}
}else{
if(NumB > NumD){
max = NumB;
}else{
max = NumD;
}
}
}else if(min==NumD){
if(NumA > NumB){
if(NumA >NumC){
max = NumA;
}else{
max = NumC;
}
}else{
if(NumB > NumC){
max = NumB;
}else{
max = NumC;
}
}
}

cha = max - min;
if(cha == 1){
if(a[9] != 'D'){
return;
}
}else if(cha == 2){
if(a[9] != 'B'){
return;
}
}else if(cha == 3){
if(a[9] != 'A'){
return;
}
}else if(cha == 4){
if(a[9] != 'C'){
return;
}
}

//打印结果
for(i=0;i<10;i++){
printf("%c",a[i]);
}

printf("\n");
//printf("  %d\n",++k);//这里可以看一共多少行结果

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: