利用简单的算法解决逻辑推理问题(推测名次/推理谁说谎)

该算法很简单,以至于我们只需要三部分就可以完成。以这一题为例:

利用简单的算法解决逻辑推理问题(推测名次/推理谁说谎)_第1张图片

 我们创建一个数组arr[6] = { 1 }

arr[1]到arr[5]分别对应A B C E,数组的值对应的是他们的比赛名次。其中arr[0]是用来立个flag的(也就是说用来做标记)。

接下来我们只需要写两个判断语句,一个循环语句即可简单的解决这样的逻辑推理问题。

一是判断数组是否符合题目要求,我们易得:


		if ((arr[2] == 2 && arr[1] != 3) || (arr[2] != 2 && arr[1] == 3))
		{
			if ((arr[2] == 2 && arr[5] != 4) || (arr[2] != 2 && arr[5] == 4))
			{
				if ((arr[3] == 1 && arr[4] != 2) || ((arr[3] != 1 && arr[4] == 2)))
				{
					if ((arr[3] == 5 && arr[4] != 3) || ((arr[3] != 5 && arr[4] == 3)))
					{
						if ((arr[5] == 4 && arr[1] != 1) || ((arr[5] != 4 && arr[1] == 1)))
						{
							printf("A = %d, B = %d, C = %d, D = %d, E = %d", arr[1], arr[2], arr[3], arr[4], arr[5]);					
						}
					}
				}
			}
		}

为了不让一个if语句特别长,所以就采用嵌套的形式了。接下来再写一个判断语句,即没有两个人的排名是一样的。易得:

int isDuplicate(int * arr, int len) 
{
	for (int i = 0; i < len; i++) {
		for (int j = i + 1; j < len; j++) 
		{
			if (arr[i] == arr[j]) 
			{
				return 0; // 返回0表示存在重复元素  
			}
		}
	}
	return 1; // 返回1表示不存在重复元素  
}

最后我们写一个循环,并且让随机数赋值给数组,然后循环判断,再用arr[0]立个flag就写完了。

以下是完整代码:

#include   
#include  

int isDuplicate(int * arr, int len) 
{
	for (int i = 0; i < len; i++) {
		for (int j = i + 1; j < len; j++) 
		{
			if (arr[i] == arr[j]) 
			{
				return 0; // 返回0表示存在重复元素  
			}
		}
	}
	return 1; // 返回1表示不存在重复元素  
}

int main()
{
	int arr[6] = { 0 };
	srand(time(NULL));

	while (arr[0] + 1)
	{
		for (int i = 1; i <= 5; i++)
		{
			arr[i] = rand() % 5 + 1;//让电脑来猜排名,通过循环一直猜,直到猜对为止。
		}

		if(isDuplicate(arr,6))//=如果为真则执行下面语句,否则一定是猜错了,继续猜。

		//这是判断语句,用于判断电脑是否猜对了
		if ((arr[2] == 2 && arr[1] != 3) || (arr[2] != 2 && arr[1] == 3))
		{
			if ((arr[2] == 2 && arr[5] != 4) || (arr[2] != 2 && arr[5] == 4))
			{
				if ((arr[3] == 1 && arr[4] != 2) || ((arr[3] != 1 && arr[4] == 2)))
				{
					if ((arr[3] == 5 && arr[4] != 3) || ((arr[3] != 5 && arr[4] == 3)))
					{
						if ((arr[5] == 4 && arr[1] != 1) || ((arr[5] != 4 && arr[1] == 1)))
						{
							printf("A = %d, B = %d, C = %d, D = %d, E = %d", arr[1], arr[2], arr[3], arr[4], arr[5]);
							arr[0] = -1;//猜对了后把arr[0]变成-1,这样循环就停止了。
						}
					}
				}
			}
		}
	}

	return 0;
}

代码的运行:

利用简单的算法解决逻辑推理问题(推测名次/推理谁说谎)_第2张图片

这个算法的核心思想是硬猜,没猜对就继续猜,直到猜对为止。因此为方法,做逻辑推问题时,我们只需要写一个判断语句判断是否猜对,没猜对就让电脑继续猜,直到猜对为止即可。算法非常简单又暴力。值得注意的是,如果你要提高运行效率,则需要生成不重复的随机数来猜。

你可能感兴趣的:(算法)