C【练习】(逻辑题)

今天主要为大家介绍几道有意思的逻辑题以及分享我个人的思考过程,抛砖引玉。

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

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

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

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

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

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

比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。
我个人在第一次看到这个题的时候主要是脑子一亮,然后没了。。。为什么没了呢,之前见过的题都是与数字有直接关系比较好思考这道题纯文字,乍一看 好像和编程没什么关系。
思考过程:
1.我自己先提取转化成数字,因为计算机只接受数字的逻辑,汉子的逻辑它看不懂
A: B2,A3;
B: B2 , E4;
C: C1 , D4;
D: C5 , D3;
E:E4 , A1;
从这里看,综合之前说的一个人只有一般是对的,我自己在本子上这样画
假设 A:B2>>B:B2>>E:A1>>C:D4>>D:C5…等等按照正常的思维去执行操作后来我发现太愚蠢了,因为这些重复的操作都可以让计算机完成;
假设 ABCDE五个人每个人都可能12345,但是只有一组情况满足题目中的要求。
1.我们首先把所有的条件遍历出来 for循环5层嵌套从A>>>E
2,条件的确认,既然题目中怎么说我们就怎么将其用计算机语言表达出来
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))

为什么这里同一条件之下使用+而不是|| 一个条件满足题意必须是一半真一半假,所以||还有一种都为真的情况,这里要注意。
–3.这点我要加亮标记,
如果只按照之前的语句我们会发现有好几种满足的条件
在这里插入图片描述
完全的不满足我们的需求,仔细观察居然还有31134的排列,我们的要求是12345每个只能且必须出现一次所以((abcde) == 120)就是一个更好的条件筛选条件!!!
在这里插入图片描述
完美!!

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

						}
					}
				}
			}
		}
	}
}

个人感觉还可以优化 但是目前还没有想到好的办法!!!

(2) 警察通过排查确定杀人凶手必为4个

嫌疑犯的一个。以下为4个嫌疑犯的供词。

A说:不是我。

B说:是C。

C说:是D。

D说:C在胡说

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

现在请根据这些信息,写一个程序来确定到底谁是凶手。
当处理完之前的题之后再一次看到这种题,突然就有的写了
思考过程:同理每个人有两种可能 不是0就是1
题目中的条件做筛选!!!

/*每种情况 有两种 不是0/1*/
	int a, b, c, d;
	for (a = 0; a <= 1; a++){
		for (b = 0; b <= 1; b++){
			for (c = 0; c <= 1; c++){
				for (d = 0; d <= 1; d++){
					if (((a == 0) +
						(c == 1) +
						(d == 1) +
						(d != 1)) == 3){
						if ((a + b + c + d) == 1){
							printf("a=%d,b=%d,c=%d,d=%d\n", a, b, c, d);
						}
					}
				}
			}
		}

	}

完美!!!!
呸!!!!
难道就没有更好的办法了?
经过我冥思苦想,外加翻阅前人著作有了改进版2.0

int kil_1(){
	char kil;
	for (kil = 'A'; kil < 'D'; kil++){
		if ((kil != 'A') +
			(kil == 'C') +
			(kil == 'D') +
			(kil != 'D') == 3){
			printf("%c", kil);
		}
	}
}

这种方法很牛逼!!主要不但简单而且通俗易懂
有4个人我就创造四个人ABCD 按照条件表示四个人的增加最后得出结果!!
吸取精华 字符也可以作为for循环的条件

生命不息奋斗不止!!!

猜你喜欢

转载自blog.csdn.net/qq_36390039/article/details/85842110