简单的逻辑编程题

<一>题目:5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果 
A选手说:B第二,我第三; 
B选手说:我第二,E第四; 
C选手说:我第一,D第二; 
D选手说:C最后,我第三; 
E选手说:我第四,A第一; 
比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。

做法和一些难点已在程序中标注出来

#include<stdio.h>
int main(void){
	int A = 0;
	int B = 0;
	int C = 0;
	int D = 0;
	int E = 0;
	for (A = 1; A < 6; A++){
		for (B = 1; B < 6; B++){
			for (C = 1; C < 6; C++){
				for (D = 1; D < 6; D++){
					for (E = 1; E < 6; E++){
						//if ((B == 2 || A == 3) && (B == 2 || E == 4) && (C == 1 || D == 2) && (C == 5 || D == 3) && (E == 4 || A == 1))
						//错误做法,看似对运动员的话进行了或判断,其实考虑得不周全,比如A选手说:B第一,我第三.
						//如果翻译成B==2||A==3则忽略了B==2时A==3是对还是错的判断,同理A==3时也忽略了B的两种可能

						//  if (((B == 2) && (A != 3) || (A == 3) && (B != 2) == 1)
						//	&& ((B == 2) && (E != 4) || (E == 4) && (B != 2) == 1)
						//	&& ((C == 1) && (D != 2) || (D == 2) && (C != 1) == 1)
						//	&& ((C == 5) && (D != 3) || (D == 3) && (C != 5) == 1)
						//	&& ((E == 4) && (A != 1) || (A == 1) && (E != 4)) == 1)
						//方法可行,但是还是略有麻烦,还有改进空间

						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) && (A != C) && (A != D) && (A != E))
							//	&& ((B != C) && (B != D) && (B != E))
							//	&& ((C != D) && (C != E))
							//	&& ((D != E)))
							//	这种方法可行,但是太过麻烦

							if (A*B*C*D*E == 120){
								//五个不同的数相乘只有唯一定值
								printf("A=%d  B=%d  C=%d  D=%d  E=%d\n",A,B,C,D,E);
							}
						}
					}
				}
			}
		}
	}
	return 0;
}

<二>题目:日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个 
嫌疑犯的一个。以下为4个嫌疑犯的供词。 
A说:不是我。 
B说:是C。 
C说:是D。 
D说:C在胡说 
已知3个人说了真话,1个人说的是假话。 
现在请根据这些信息,写一个程序来确定到底谁是凶手。

#include<stdio.h>
int main(void){
	char killer = 'A';
	char a = 'A', b = 'B', c = 'C', d = 'D';
	for (killer = 'A'; killer <= 'D'; killer++){
		//先把凶手是ABCD的情况都假设一遍,然后套进判断语句中,如果没有自相矛盾则那个人就是凶手
		if ((killer != a) + (killer == c) + (killer == d) + (killer != d) == 3)	
			//因为有一个人在说谎,所以四个人加起来真值为3
			printf("%c\n", killer);
	}
	return 0;
}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值