C语言暴力破解偶然在论坛上看到的一个推理题

这是源题目:
在这里插入图片描述
文字提取:
五、推理题(40分)
1、这道题的答案是()
A、A B、B C、C D、D
2、第5题的答案是()
A、C B、D C、A D、B
3、以下选项中哪一题的答案与其它三项不同()
A、第3题 B、第6题 C、第2题 D、第4题
4、以下选项中哪两题的答案相同()
A、第1、5题 B、第2、7题 C、第1、9题 D、第6、10题
5、以下选项中哪一题的答案与本题相同()
A、第8题 B、第4题 C、第9题 D、第7题
6、以下选项中哪两题的答案与第8题相同()
A、第2、4题 B、第1、6题 C、第3、10题 D、第5、9题
7、在此十道题中,被选择次数最少的选项字母为()
A、C B、B C、A D、D
8、以下选项中哪一题的答案与第1题的答案在字母表中不相邻()
A、第7题 B、第5题 C、第2题 D、第10题
9、已知“第1题与第6题的答案相同”与“第X题与第5题的答案相同”的真假性相反,那么X为()
A、第6题 B、第10题 C、第2题 D、第9题
10、在此十道题中,ABCD四个字母中出现的次数最多者与最少者的差为()
A、3 B、2 C、4 D、1
本试题的答案为:

正确答案是:B,C,A,C,A,C,D,A,B,A
有且只有这一个。

c语言实现的源码在下面,
在这里插入图片描述

破解思路:
如果某个答案是正确的,那么每个问题都必须成立。

源码在后面:
核心函数:

/*
 获取正确的答案
* @param[in]   result   存放结果的数组
* @param[in]   index    题目的个数
*/
int get_result(char *result , int index)
{
	int i = 0;
	int ret = S_OK;
	if(0 == index)
	{
		result_printf(result);        /*破解过程打印,耗时间,可选择注释*/
		ret = all_is_right(result);
		return ret;
	}
	result[--index] = 0;
	for(i=0 ; i < OPTION_NUM ; i++)
	{
		ret = get_result(result , index);
		if(S_OK == ret)
		{
			return ret;
		}
		result[index]++;
	}
	return ret;
}

所有代码:

/**
 *    COPYRIGHT NOTICE
 *    Copyright (c) 2020-03, YINWUHUI
 *    All rights reserved.
 *
 * @file jianjiandandanyidaoti.c
 *
 * 由给定个数的题目答案之间的关系,获取正确的答案
 *
 *    版本      作者        日期            修订说明
 *
 *   1.00       SZ.ywh      2020-03-28      最初版本
 *   
 *	 
 */
#include<stdio.h>

#define QUESTION_NUM 10
#define OPTION_NUM 4
#define S_OK 0
#define ERROR -1

int get_result(char *result , int index);
int all_is_right(char *result);
int max_min_num(char *result,char *abcd);
int diff_int_max_min(char* num_list, int num);
char char_least_selected(char * abcd,int num);
int char_border_other(char first, char second);
int second_is_right(char *result);
int thirdly_is_right(char *result);
int fourth_is_right(char *result);
int fifth_is_right(char *result);
int sixth_is_right(char *result);
int seventh_is_right(char *result);
int eighth_is_right(char *result);
int ninth_is_right(char *result);
int tenth_is_right(char *result);
void result_printf(char *result);

char ABCD[OPTION_NUM] = {'A','B','C','D'};

int main(void)
{
	int ret = S_OK;	
	char result[QUESTION_NUM] = {0};   /*初始值为全A*/
	ret = get_result(result ,QUESTION_NUM);
	if(S_OK != ret)
	{
		printf("Nothing is difficult if you set your mind to it.\n");
	}
	else
	{
		printf("congratulations!!!\n");
		result_printf(result);
	}
	return ;
}

/*打印结果*/
void result_printf(char *result)
{
	printf("The answer is : %c,%c,%c,%c,%c,%c,%c,%c,%c,%c\n"
		,ABCD[result[0]],ABCD[result[1]],ABCD[result[2]],ABCD[result[3]],ABCD[result[4]]
		,ABCD[result[5]],ABCD[result[6]],ABCD[result[7]],ABCD[result[8]],ABCD[result[9]]);
}

/*
 获取正确的答案
* @param[in]   result   存放结果的数组
* @param[in]   index    题目的个数
*/
int get_result(char *result , int index)
{
	int i = 0;
	int ret = S_OK;
	if(0 == index)
	{
		result_printf(result);        /*破解过程打印,耗时间,可选择注释*/
		ret = all_is_right(result);
		return ret;
	}
	result[--index] = 0;
	for(i=0 ; i < OPTION_NUM ; i++)
	{
		ret = get_result(result , index);
		if(S_OK == ret)
		{
			return ret;
		}
		result[index]++;
	}
	return ret;
}

/*判断两个字符是否相邻*/
int char_border_other(char first, char second)
{
	if(first > second)
	{
		if((first - second) <= 1)
		{
			return 1;
		}
		return S_OK;
	}
	else
	{
		if((second - first) <= 1)
		{
			return 1;
		}
		return S_OK;
	}
}

/*选择次数最少的字符*/
char char_least_selected(char * abcd,int num)
{
	int i = 0;
	int mini = 0;
	for(i=0 ; i< num ; i++)
	{
		if(abcd[mini] >= abcd[i])
		{
			mini = i;
		}
	}
	return ABCD[mini];
}

/*最多的与最少的差值*/
int diff_int_max_min(char* abcd, int num)
{
	int i = 0;
	int max = 0;
	int min = 0;
	for(i=0 ; i< num ; i++)
	{
		if(abcd[min] >= abcd[i])
		{
			min = i;
		}
		if(abcd[max] <= abcd[i])
		{
			max = i;
		}
	}
	return abcd[max] - abcd[min];
}

/*统计每个字符的个数*/
int max_min_num(char *result,char *abcd)
{
    int i = 0;
	for(i=0 ; i < QUESTION_NUM ; i++)
	{
		switch(ABCD[result[i]])
		{
			case 'A':abcd[0]++;break;
			case 'B':abcd[1]++;break;
			case 'C':abcd[2]++;break;
			case 'D':abcd[3]++;break;
			default: 
				return ERROR;
		}
	}
	return S_OK;
}

/*所有的选项的条件都成立*/
int all_is_right(char *result)
{
	int ret = S_OK;
	ret = second_is_right(result);
	if(S_OK != ret)
	{
		return ret;
	}
	ret = thirdly_is_right(result);
	if(S_OK != ret)
	{
		return ret;
	}
	ret = fourth_is_right(result);
	if(S_OK != ret)
	{
		return ret;
	}
	ret = fifth_is_right(result);
	if(S_OK != ret)
	{
		return ret;
	}
	ret = sixth_is_right(result);
	if(S_OK != ret)
	{
		return ret;
	}
	ret = seventh_is_right(result);
	if(S_OK != ret)
	{
		return ret;
	}
	ret = eighth_is_right(result);
	if(S_OK != ret)
	{
		return ret;
	}
	ret = ninth_is_right(result);
	if(S_OK != ret)
	{
		return ret;
	}
	ret = tenth_is_right(result);
	if(S_OK != ret)
	{
		return ret;
	}
	return ret;
}

/*第二题正确*/
int second_is_right(char* result)
{
	switch (ABCD[result[1]])
	{
		case 'A':
		{
			if('C' == ABCD[result[4]])
			{return S_OK;}
			break;
		}
		case 'B':
		{
			if('D' == ABCD[result[4]])
			{return S_OK;}
			break;
		}
		case 'C':
		{
			if('A' == ABCD[result[4]])
			{return S_OK;}
			break;
		}
		case 'D':
		{
			if('B' == ABCD[result[4]])
			{return S_OK;}
			break;
		}
		default:
			break;
	}
	return ERROR;
}

/*第三题正确*/
int thirdly_is_right(char* result)
{
	switch (ABCD[result[2]])
	{
		case 'A':
		{
			if((result[2] != result[5]) && (result[5] == result[1])&& (result[1] == result[3]))
			{return S_OK;}
			break;
		}
		case 'B':
		{
			if((result[2] == result[1]) && (result[5] != result[2])&& (result[2] == result[3]))
			{return S_OK;}
			break;
		}
		case 'C':
		{
			if((result[2] == result[5]) && (result[5] != result[1])&& (result[5] == result[3]))
			{return S_OK;}
			break;
		}
		case 'D':
		{
			if((result[2] == result[5]) && (result[5] == result[1])&& (result[1] != result[3]))
			{return S_OK;}
			break;
		}
		default:
			break;
	}
	return ERROR;
}

/*第四题正确*/
int fourth_is_right(char* result)
{
	switch (ABCD[result[3]])
	{
		case 'A':
		{
			if(result[0] == result[4])
			{return S_OK;}
			break;
		}
		case 'B':
		{
			if(result[1] == result[6])
			{return S_OK;}
			break;
		}
		case 'C':
		{
			if(result[0] == result[8])
			{return S_OK;}
			break;
		}
		case 'D':
		{
			if(result[5] == result[9])
			{return S_OK;}
			break;
		}
		default:
			break;
	}
	return ERROR;
}

/*第五题正确*/
int fifth_is_right(char* result)
{
	switch(ABCD[result[4]])
	{
		case 'A':
		{
			if(result[4] != result[7])
			{return ERROR;}
			break;
		}
		case 'B':
		{
			if(result[4] != result[3])
			{return ERROR;}
			break;
		}
		case 'C':
		{
			if(result[4] != result[8])
			{return ERROR;}
			break;
		}
		case 'D':
		{
			if(result[4] != result[6])
			{return ERROR;}
			break;
		}
		default:
			break;
	}
	return S_OK;
}
/*第六题正确*/
int sixth_is_right(char* result)
{
	switch (ABCD[result[5]])
	{
		case 'A':
		{
			if((result[1] == result[3]) && (result[3] == result[7]))
			{
				return S_OK;
			}
			break;
		}
		case 'B':
		{
			if((result[0] == result[5]) && (result[5] == result[7]))
			{
				return S_OK;
			}
			break;
		}
		case 'C':
		{
			if((result[2] == result[9]) && (result[9] == result[7]))
			{
				return S_OK;
			}
			break;
		}
		case 'D':
		{
			if((result[4] == result[8]) && (result[8] == result[7]))
			{
				return S_OK;
			}
			break;
		}
		default:
			break;
	}
	return ERROR;
}
/*第七题目正确*/
int seventh_is_right(char* result)
{
	char abcd[4] = {0};
	max_min_num(result,abcd);
	int char_least = char_least_selected(abcd, OPTION_NUM);
	switch (ABCD[result[6]])
	{
		case 'A':
		{
			if('C' == char_least)
			{
				return S_OK;
			}
			break;
		}
		case 'B':
		{
			if('B' == char_least)
			{
				return S_OK;
			}
			break;
		}
		case 'C':
		{
			if('A' == char_least)
			{
				return S_OK;
			}
			break;
		}
		case 'D':
		{
			if('D' == char_least)
			{
				return S_OK;
			}
			break;
		}
		default:
			break;
	}
	return ERROR;
}
/*第八题目正确*/
int eighth_is_right(char* result)
{
	switch(ABCD[result[7]])
	{
		case 'A':
		{
			if(0 == char_border_other(result[0],result[6]))
			{
				return S_OK;
			}
			break;
		}
		case 'B':
		{
			if(0 == char_border_other(result[0],result[4]))
			{
				return S_OK;
			}
			break;
		}
		case 'C':
		{
			if(0 == char_border_other(result[0],result[1]))
			{
				return S_OK;
			}
			break;
		}
		case 'D':
		{
			if(0 == char_border_other(result[0],result[9]))
			{
				return S_OK;
			}
			break;
		}
		default:
			break;
	}
	return ERROR;
}
/*第九题正确*/
int ninth_is_right(char* result)
{
	switch (ABCD[result[8]])
	{
		case 'A':
		{
			if(((result[0] == result[5]) && (result[5] != result[4]))
				||((result[0] != result[5]) && (result[5] == result[4])))
			{
				return S_OK;
			}
			break;
		}
		case 'B':
		{
			if(((result[0] == result[5]) && (result[9] != result[4]))
				||((result[0] != result[5]) && (result[9] == result[4])))
			{
				return S_OK;
			}
			break;
		}
		case 'C':
		{
			if(((result[0] == result[5]) && (result[1] != result[4]))
				||((result[0] != result[5]) && (result[1] == result[4])))
			{
				return S_OK;
			}
			break;
		}
		case 'D':
		{
			if(((result[0] == result[5]) && (result[8] != result[4]))
				||((result[0] != result[5]) && (result[8] == result[4])))
			{
				return S_OK;
			}
			break;
		}
		default:
			break;
	}
	return ERROR;
}
/*第十题正确*/
int tenth_is_right(char* result)
{
	char abcd[OPTION_NUM] = {0};
	max_min_num(result,abcd);
	switch(ABCD[result[9]])
	{
		case 'A':
		{
			if(3 == diff_int_max_min(abcd,OPTION_NUM))
			{
				return S_OK;
			}
			break;
		}
		case 'B':
		{
			if(2 == diff_int_max_min(abcd,OPTION_NUM))
			{
				return S_OK;
			}
			break;
		}
		case 'C':
		{
			if(4 == diff_int_max_min(abcd,OPTION_NUM))
			{
				return S_OK;
			}
			break;
		}
		case 'D':
		{
			if(1 == diff_int_max_min(abcd,OPTION_NUM))
			{
				return S_OK;
			}
			break;
		}
		default:
			break;
	}
	return ERROR;
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值