【蓝桥杯试题 - OJ】 凶手

Description

巴斯维克命案抓住了六个嫌疑犯,他们的口供如下:

A:我不是罪犯

B:A、C中有一个是罪犯

C:A和B说了假话

D:C和F说了假话

E:其他五个人中,只有A和D说了真话

F:我是罪犯

他们中只有一半说了真话,凶手只有一个。

本题可能有多种可能性,即正确答案(找到唯一的凶手)可能有多个,但每一个可能的答案(某一个是凶手)都满足上述口供。

请编程找出可能的凶手输出。

样例:(假设唯一的凶手是A或者D或者E,则输出结果为三行,按字母顺序依次输出)

A

D

E

Input

如题所示。

Output

如题所示。

Sample Input 1 

参考上文 

Sample Output 1

参考上文

个人写法:

        我写的不具备参考价值哈!因为写的特别冗杂,我后面抽空会跟进一个更快更短的写法,但是这个代码我依旧发出来,相当于是介绍一个思路而已

通关代码如下:

#include <bits/stdc++.h>
using namespace std;

bool True[10];   //判断说的是真话(true)还是假话(false)
bool Murder[10]; //判断是(true)否(false)是凶手

//以下函数都是判断每个人的话语以及是否是凶手

void AW() {
	if (Murder[0] == true) { //A下标为0,以此类推
		True[0] = false;     //如果A是凶手,则A说谎
	}
	else True[0] = true;
}

void BW() {
	if (Murder[1] == true) {   //如果B是凶手,则B说谎
		True[1] = false;
	}
	else if (Murder[0] == true || Murder[2] == true) { //如果B不是凶手,AC中有一个是凶手则说了真话
		True[1] = true;
	}
	else True[1] = false; //不然就直接判断是说谎
}

void CW() {
	if (Murder[2] == true) {  //以上面的写法类推
		True[2] = false;
	}
	else if (True[0] == false && True[1] == false) {
		True[2] = true;
	}
	else True[2] = false;
}

void DW() {
	if (Murder[3] == true) {
		True[3] = true;
	}
	else if (True[2] == false && True[5] == false) {
		True[3] = true;
	}
	else {
		True[3] = false;
	}
}

void EW() {
	if (Murder[4] == true) {
		True[4] = true;
	}
	else if (True[0] == true && True[1] == false && True[2] == false && True[3] == true && True[5] == false) {
		True[4] = true;
	}
	else True[4] = false;
}

void FW() {
	if (Murder[5] == true) {
		True[5] = true;
	}
	else True[5] = false;
}

int main() {
	char member[] = "ABCDEF";
	//cout << menber[1];

	for (int i = 0; i < 6; i++) {
		int count = 0;
		memset(Murder, false, sizeof(Murder));  //默认六个人都不是凶手,往下逐个判断
		Murder[i] = true;  //从A开始,假设它是凶手,往下判断

		AW();
		FW();
		BW();
		CW();
		DW();
		EW();
		

		for (int j = 0; j < 6; j++) {
			if (True[j] == true) count++;  //如果说真话的人正好是三个,那符合了条件,此人是凶手
		}
		if (count == 3) {
			cout << member[i] << endl;
		}
	}
	
	return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

桦彦司

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值