当前位置 : 主页 > 编程语言 > c语言 >

手把手教你猜名次和猜凶手思路

来源:互联网 收集:自由互联 发布时间:2023-09-06
完整代码 猜名次int main(){int a = 0;int b = 0;int c = 0;int d = 0;int 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((a == 3) + (b == 2) == 1 (b == 2) + (e

完整代码

猜名次
int main()
{
	int a = 0;
	int b = 0;
	int c = 0;
	int d = 0;
	int 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((a == 3) + (b == 2) == 1
						&& (b == 2) + (e == 4) == 1
						&& (c == 1) + (d == 2) == 1
						&& (c == 5) + (d == 3) == 1
						&& (e == 4) + (a == 1) == 1
						&& a * b * c * d * e == 120)
						{
							printf("A=%d  B=%d  C=%d  D=%d  E=%d ", a, b, c, d, e);
						}
					}
				}
			}
		}
	}
猜凶手
#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", killer);
		}
	}
	return 0;
}

@TOC

猜名次

题目介绍:

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

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

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

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

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

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

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

做题思路

遍历所有种可能

假设所有位置所有情况都试过了,只需要把满足的那个情况打印出来就可以了,让所有人都当过第一名到第五名。

int main()
{
	int a = 0;
	int b = 0;
	int c = 0;
	int d = 0;
	int 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++)
					{
						。。。。。。
					}
			    }
			}
		}
	}
}
设置判断条件

题目中的这句“每位选手都说对了一半”是做题的关键 说对了一半,也就变相告诉我们每位选手说的话一半为真,一半为假。 我们都知道,1为真,0为假; 所以对单个选手进行判断:(前半句话)+(后半句话)== 1; 对于多个选手进行判断就只需要用&&进行连接即可

if((a == 3) + (b == 2) == 1
&& (b == 2) + (e == 4) == 1
&& (c == 1) + (d == 2) == 1
&& (c == 5) + (d == 3) == 1
&& (e == 4) + (a == 1) == 1
设置限制条件

根据上面的情况,我们可以找出符合条件的配对,但是这样真的就已经完美了吗? 例如:A 第一名 B 第二名 C 第一名 D 第三名 E 第一名 这个配对也是可以满足判断条件的,但是根据常理分析,第一名到第五名的拥有者只能是唯一的。 所以我们可以知道,配对的基础就是: 一个第一名 一个第二名 一个第三名 一个第四名 一个第五名 所有的名次进行相乘的话,要满足:A * B * C * D * E == 120; 条件补充如下

if((a == 3) + (b == 2) == 1
&& (b == 2) + (e == 4) == 1
&& (c == 1) + (d == 2) == 1
&& (c == 5) + (d == 3) == 1
&& (e == 4) + (a == 1) == 1
&& a * b * c * d * e == 120)

将以上所有的要素结合起来之后,就可以得到以下完整代码:

int main()
{
	int a = 0;
	int b = 0;
	int c = 0;
	int d = 0;
	int 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((a == 3) + (b == 2) == 1
						&& (b == 2) + (e == 4) == 1
						&& (c == 1) + (d == 2) == 1
						&& (c == 5) + (d == 3) == 1
						&& (e == 4) + (a == 1) == 1
						&& a * b * c * d * e == 120)
						{
							printf("A=%d  B=%d  C=%d  D=%d  E=%d ", a, b, c, d, e);
						}
					}
				}
			}
		}
	}

	return 0;
}

猜凶手

题目介绍:

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

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

A说:不是我。

B说:是C。

C说:是D。

D说:C在胡说

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

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

做题思路

遍历所有种可能

如果要找出谁是凶手,那么只要让所有人都当一次凶手,然后找出那个满足所有条件的人,那个人就是凶手。

char killer = 0;
for(killer = 'A'; killer <= 'D'; killer++)
{
	。。。。。。
}
设置判断条件

根据题目所说的“已知3个人说了真话,1个人说的是假话。” 可以间接的告诉我们:这四个人的话有三个为真,一个为假 又因为1为真,0为假 所有可以得出以下判断

if((killer != 'A')
	 + (killer == 'C')
	  + (killer == 'D')
	   + (killer != 'D') == 3)
	{
		printf("犯人是%c", killer);
	}

结合以上元素后,可以得到以下的完整代码:

#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", killer);
		}
	}
	return 0;
}

分享到这里就结束了,如果本文哪里有错误,还请大家指出,请在评论区留言; 如果觉得有用的话,还请给个免费的赞,灰常感谢捏!

网友评论