一道展现思维逻辑的编程题:猜凶手

97 阅读2分钟

前言

  各位在学习代码越来越循序渐进的时候,是否会意识到,代码本身并不难写,难的是我们的思维的推拓的呢。这道看似困难的编程题,在写出来的时候竟惊奇的发现不过寥寥几行。这也侧面表现出我们的思维的重要性,下面给各位带来我的思维过程。

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

A说:不是我。

B说:是C。

C说:是D。

D说:C在胡说

已知3个人说了真话,1个人说的是假话。 现在请根据这些信息,写一个程序来确定到底谁是凶手。

思维过程

  感受:想必大家在看到供词的时候一开始难以想象如何将这些文字转换成代码的形式表达出来。其次:三人真话一人假话又该如何转换成代码的语言呢。

  我发现这四句话都是主观意识上的,如果我们作为判断的人,就不能站在他们的角度来看待这句话。 于是 A说:不是我。这句话我们是否能够将其认为凶手不是A

那么他们的话就代表。

A说:不是我。 凶手不是A killer = 'a';

B说:是C。 凶手是C killer == 'c'

C说:是D。 凶手是D killer == 'd'

D说:C在胡说 凶手不是Dkiller != 'd'

于此同时我们需要一个未知数代表我们的凶手,在发现四人的名字我们能够通过字符代替的时候。就能完美的联想到 killer(凶手)='a' | 'b' | 'c' | 'd'。 字符abcd是连续的,我们通过一个简单的for循环按顺序判断即可, 真话在代码语言中就是1;假话就是0。三人真话就是3,只要不等于3,就不满足我们的三人真话一人假话的条件。

完整代码

//A说:不是我。killer不是'A'
//B说:是C。 killer是'C'
//C说:是D。 killer是'D'
//D说:C在胡说 killer不是'd'
//已知3个人说了真话,1个人说的是假话。
//现在请根据这些信息,写一个程序来确定到底谁是凶手。
#include<stdio.h>
int main()
{
	char killer = 0;
	for (killer = 'a'; killer <= 'd'; killer++)
	{
		if ((killer != 'a') + (killer == 'c') + (killer == 'd') + (killer != 'd') == 3)
		{
			printf("凶手是%c\n", killer);
		}
	}
	return 0;
}