温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何进行C语言猜凶手及类似题目的实现

发布时间:2022-01-10 14:43:42 来源:亿速云 阅读:185 作者:柒染 栏目:开发技术

这期内容当中小编将会给大家带来有关如何进行C语言猜凶手及类似题目的实现,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

    描述:

    日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为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;
    }

            结果如下:

    如何进行C语言猜凶手及类似题目的实现

    现在,我们来看和它相似的第二道题目:

    描述:

            两个乒乓球队进行比赛,甲队为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 %c\n", A, B, C);
    						}
    						
    					}
    				}
    			}
    		}
    	return 0;
    }

            结果如下:

    如何进行C语言猜凶手及类似题目的实现

    第三道题目:

    描述:

    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 %d\n", a, b, c, d, e);
    							}	
    						}
    					}
    				}
    			}
    		}
    	}
    	return 0;
    }

    如何进行C语言猜凶手及类似题目的实现

    最后一道题目来看,出现了惊人的五个for循环。同时,每一个for循环都是循环5次,时间复杂度达到了O(n * n)。也就是说,一旦要判断的人数增多,计算机的计算速度将会以肉眼可见的速度慢下去。

    上述就是小编为大家分享的如何进行C语言猜凶手及类似题目的实现了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。

    向AI问一下细节

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    AI