目录
- 描述:
- 思路及分析:
- 现在,我们来看和它相似的第二道题目:
- 描述:
- 思路及分析:
- 第三道题目:
- 描述:
- 思路及分析:
- 总结:
描述:
日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。
以下为4个嫌疑犯的供词:
a说:不是我。
b说:是c。
c说:是d。
d说:c在胡说
已知3个人说了真话,1个人说的是假话。
现在请根据这些信息,写一个程序来确定到底谁是凶手。
思路及分析:
从来没有做过类似题目的同学第一次看见这道题,可能有点发懵。然后开始考虑假设,排列组合,枚举等等…但是这道题的代码结果会让你大吃一惊。
首先,要考虑的是如何用代码表示a,b,c,d这四个人说的话?我们定义一个char变量killer来表示凶手。最能想到的就是如果某个人说的话是成立的话,将他的结果为1(类似于bool类型),否则就是0。这样的想法是正确的。a说,不是a,那么,可以表示为killer != ‘a’。判断成立的话,他就会返回1,否则,返回0。类似的,其他3个人说的话也可以这样来表示。最后,根据3个人说了真话,1个人说了假话得知返回的总和为3。比如,我们假设a就是凶手,那么根据四个人说的话,a说了假话,b也说了假话,和条件是不符合的。这样之后,只是判断了a的情况,b,c,d的情况还没有判断,只需要加一个循环就可以了。
c语言代码如下:
#include<stdio.h> int main(void) { char killer = 'a'; for (killer = 'a'; killer <= 'd'; killer++) { if ((killer != 'a') + (killer == 'c') + (killer == 'd') + (killer != 'd') == 3) { printf("the killer is %c", killer); } } return 0; }
结果如下:
现在,我们来看和它相似的第二道题目:
描述:
两个乒乓球队进行比赛,甲队为abc三人;乙队为xyz三人;抽签决定比赛名单,有人向队员打听比赛的名单,a说他不和x比,c说他不和z比。请编程输出所有可能的对阵方案,并统计方案的个数。
思路及分析:
这道题和猜凶手那道题目的方法是一致的,都是直接把题目的文字描述转换为代码描述。直接使用 for循环即可。代码如下:
#include<stdio.h> int main(void) { char a = 0; char b = 0; char c = 0; for (a = 'x'; a <= 'z'; a++) { for (b = 'x'; b <= 'z'; b++) { for (c = 'x'; c <= 'z'; c++) { if ((a != 'x') + (c != 'z') == 2) { if (a != b && b != c && c != a) { printf("a vs %c, b vs %c, c vs %cn", a, b, c); } } } } } return 0; }
结果如下:
第三道题目:
描述:
5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果:
a选手说:b第二,我第三;
b选手说:我第二,e第四;
c选手说:我第一,d第二;
d选手说:c最后,我第三;
e选手说:我第四,a第一;
比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。
思路及分析:
暴力破解法即可。代码如下:
#include<stdio.h> int main(void) { int a = 0, b = 0, c = 0, d = 0, e = 0; for (a = 1; a <= 5; a++) { for (b = 1; b <= 5; b++) { for (c = 1; c <= 5; c++) { for (d = 1; d <= 5; d++) { for (e = 1; e <= 5; e++) { if (((b == 2) + (a == 3) == 1) && //b第二,我第三 ((b == 2) + (e == 4) == 1) && //我第二,e第四 ((c == 1) + (d == 2) == 1) && //我第一,d第二 ((c == 5) + (d == 3) == 1) && //c最后,我第三 ((e == 4) + (a == 1) == 1)) //我第四,a第一 { if (a * b * c * d * e == 120) { printf("%d %d %d %d %dn", a, b, c, d, e); } } } } } } } return 0; }
总结:
最后一道题目来看,出现了惊人的五个for循环。同时,每一个for循环都是循环5次,时间复杂度达到了o(n * n)。也就是说,一旦要判断的人数增多,计算机的计算速度将会以肉眼可见的速度慢下去。类似的题目采用暴力破解的方法虽然不是最优解,但却是最直观简单,好理解的方法。
到此这篇关于c语言猜凶手及类似题目的实现示例的文章就介绍到这了,更多相关c语言猜凶手内容请搜索<计算机技术网(www.ctvol.com)!!>以前的文章或继续浏览下面的相关文章希望大家以后多多支持<计算机技术网(www.ctvol.com)!!>!
需要了解更多c/c++开发分享C语言猜凶手及类似题目的实现示例,都可以关注C/C++技术分享栏目—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/1038161.html