C语言解决逻辑分析题(猜凶手)(猜名次)

前言:

本文介绍如何去解决逻辑分析题的大致思路。

题目一:

猜凶手

题干:

日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。

以下为4个嫌疑犯的供词:

A说:不是我。

B说:是C。

C说:是D。

D说:C在胡说

已知3个人说了真话,1个人说的是假话。

现在请根据这些信息,写一个程序来确定到底谁是凶手。

思路:

这是一道典型的逻辑分析题,我们可以循环遍历4种情况(分别当A、B、C、D各为凶手时),然后由已知3个人说了假话,1个人说的是真话来判定最后谁是凶手。

代码:

int main()
{
	//假设凶手就是a,遍历循环
	for (char a='a';a<='d'; a++)
	{
		if ((a != 'a') + (a == 'c') + (a == 'd') + (a != 'd') == 3)//按照题目要求,最后相加为3
			printf("凶手就是%c", a);
	}
	return 0;
}

题目二:

题干:

5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果:

A选手说:B第二,我第三;

B选手说:我第二,E第四;

C选手说:我第一,D第二;

D选手说:C最后,我第三;

E选手说:我第四,A第一;

比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。

思路:

考虑到一共五个人,直接模拟推理有些太难,计算机最擅长的遍历此时就会派上用场,将每个人从第1到第5来一遍,则一共会产生5^5种可能性,这个只需要一个5层循环即可搞定。但是这样会导致一些不期望出现的结果出现,所以最后加一个限制条件即可

代码:

//猜名次
int main()
{
	for (int a=1;a<=5;a++)
	{
		for (int b=1;b<=5;b++)
		{
			for (int c=1;c<=5;c++)
			{
				for (int d=1;d<=5;d++)
				{
					for (int e=1;e<=5;e++)
					{
						if ((b == 2) + (a == 3) == 1 &&
							(b == 2) + (e == 4) == 1 &&
							(c == 1) + (d == 2) == 1 &&
							(c == 5) + (d == 3) == 1 &&
							(e == 4) + (a == 1) == 1)
						{
							if (a * b * c * d * e == 120)
								printf("a=%d b=%d c=%d d=%d e=%d", a, b, c, d, e);
						}
					}
				}
			}
		}
	}
	return 0;
}

灵魂总结:

以后再遇到这类逻辑分析题,我们可以尝试用遍历循环来解决,这种方法最大难点在于如何写出遍历循环的条件。

你可能感兴趣的:(算法,数据结构)