逻辑推理题

谁是贼?

公安人员审问四名窃贼嫌疑犯。已知,这四人当中仅有一名是窃贼,还知道这四人中每人要么是诚实的,要么总是说谎。在回答公安人员的问题中:

甲说:“乙没有偷,是丁偷的。”

乙说:“我没有偷,是丙偷的。”

丙说:“甲没有偷,是乙偷的。”

丁说:“我没有偷”

请根据这四人的谈话判断谁是盗窃者

*问题分析

假设A、B、C、D分别代表四个人

1代表该人是窃贼;0代表不是贼

甲 A 乙 B 丙 C 丁 D
甲 A 0 1
乙 B 0 1
丙 C 0 1
丁 D 0

由题目已知:

1 四人中有且仅有一个窃贼;

2 这四个人中的每个人要么说真话,要么说假话;

3 由于甲、乙、丙三人都说了两句话:“X没偷,X偷了”,故不论该人是否说谎,他提到的两人中必有一人是小偷。

甲 A 乙 B 丙 C 丁 D
甲 A 0 1
甲 A说谎 1 0
乙 B 0 1
乙 B说谎 1 0
丙 C 0 1
丙 C 1 0
丁 D 0
丁 D说谎 1

故在列条件表达式时,可以不关心谁说谎,谁说实话。这样,可以列出下列条件表达式:

1 甲:B+D=1

2 乙:B+C=1

3 丙:A+B=1

丁说的是废话,但是不重要,反正有人偷了:A+B+C+D=1

package bb;
public class 谁是贼 {
public static final int A = 0, B = 1, C = 2, D = 3;
public static final int LEN = 4;
public static void main(String[] args) {
int i, _thief;
int a[] = new int[LEN];
for (i = 0; i < LEN; i++) {
// 数组初始化,每次假设一个人是贼(贼:1,其余:0)
// 0:1000
// 1:0100
// 2:0010
// 3:0001
for (_thief = 0; _thief < LEN; _thief++) {
if (_thief == i) {
a[_thief] = 1;
} else {
a[_thief] = 0;
}
System.out.print(_thief + ":" + a[_thief] + " ");
}
System.out.println();
if (a[B] + a[D] == 1 && a[B] + a[C] == 1 && a[A] + a[B] == 1) {
System.out.println("贼是: ");
for (_thief = 0; _thief < LEN; _thief++) {
if (a[_thief] == 1) {
System.out.println((char) ('A' + _thief));
}
}
break;
}
}
}
}

答案:B


谁说谎?

张三说李四在说谎,李四说王五在说谎,王五说张三和李四都在说谎。

现在问:这三人中到底谁说的是真话,谁说的是假话?

*问题分析

分析题目,每个人都有可能说的是真话,也有可能说的是假话;这样就需要对每个人所说的话进行分别判断。

假设三个人所说的话的真假用变量A、B、C表示,等于1表示该人说的是真话;

张三 a 李四 b 王五 c
张三 a 0/1 0
李四 b 0/1 0
王五 c 0 0 0/1

展开来,得到如下表达式:

张三说真话 a == 1 && b == 0
张三说假话 a == 0 && b == 1
李四说真话 b == 1 && c == 0
李四说假话 b == 0 && c == 1
王五说真话 c == 1 && a == 0 && b == 0
王五说假话 c == 0 && (b == 1 || c == 1)

分别假设每个人说真话、说假话的场景,进行判断即可。

package bb;
public class 谁说谎 {
public static void main(String[] args) {
int a, b, c;
for (a = 0; a <= 1; a++) {
for (b = 0; b <= 1; b++) {
for (c = 0; c <= 1; c++) {
boolean aTrue = (a == 1 && b == 0);
boolean aFalse = (a == 0 && b == 1);
boolean bTrue = (b == 1 && c == 0);
boolean bFalse = (b == 0 && c == 1);
boolean cTrue = (c == 1 && a == 0 && b == 0);
boolean cFalse = (c == 0 && (b == 1 || c == 1));
// 要么讲真,要么说谎
boolean aJudge = (aTrue || aFalse);
boolean bJudge = (bTrue || bFalse);
boolean cJudge = (cTrue || cFalse);
if (aJudge && bJudge && cJudge) {
System.out.println("a=" + a);
System.out.println("b=" + b);
System.out.println("c=" + c);
}
}
}
}
}
}

诚实族和说谎族

诚实族和说谎族是来自两个荒岛的不同民族,诚实族的人永远说真话,而说谎族的人永远说假话。

迷语博士是个聪明的人,他要来判断所遇到的人是来自哪个民族的。

迷语博士遇到三个人,知道他们可能是来自诚实族或说谎族的。为了调查这三个人是什么族的,博士分别问了他们的问题,这是他们的对话:

问第一个人:“你们是什么族?”

第一个人答:“我们之中有两个来自诚实族。”

第二个人说:“不要胡说,我们三个人中只有一个是诚实族的。”

第三个人听了第二个人的话后说:“对,就是只有一个诚实族的。”

请根据他的回答判断他们分别是哪个族的。

问题分析与算法设计

假设这三个人分别为A、B、C,若说谎其值为0,若诚实,其值为1。根据题目中三个人的话可分别列出:

第一个人: a&&a+b+c2||!a&&a+b+c!=2

第二个人: b&&a+b+c1||!b&&a+b+c!=1

第三个人: c&&a+b+c==1||!c&&a+b+c!=1

利用穷举法,可以很容易地推出结果。

package bb;
public class 诚实族和说谎族 {
// 说谎:0
// 诚实:1
static String Judge(int var) {
if (var == 1) {
return "honest";
} else {
return "lier";
}
}
public static void main(String[] args) {
int a, b, c;
for (a = 0; a <= 1; a++) {
for (b = 0; b <= 1; b++) {
for (c = 0; c <= 1; c++) {
// a讲真,2个诚实族
boolean aTrue = ((a == 1) && (a + b + c == 2));
// a说谎,不是2个诚实族
boolean aFalse = ((a == 0) && (a + b + c != 2));
boolean bTrue = ((b == 1) && (a + b + c == 1));
boolean bFalse = ((b == 0) && (a + b + c != 1));
boolean cTrue = ((a == 1) && (a + b + c == 1));
boolean cFalse = ((a == 0) && (a + b + c != 1));
// a,b,c同时:要么真,要么假
if ((aTrue || aFalse) && (bTrue || bFalse) && (cTrue || cFalse)) {
System.out.println("A is a " + Judge(a));
System.out.println("B is a " + Judge(b));
System.out.println("C is a " + Judge(c));
}
}
}
}
}
}

球队比赛

两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。

问题分析

x y z
a 0
b
c 0 0

参考答案:

a vs z

b vs x

c vs y

package bb;
public class 球队比赛 {
public static void main(String[] args) {
int a, b, c;
for (a = 'x'; a <= 'z'; a++) {
for (b = 'x'; b <= 'z'; b++) {
for (c = 'x'; c <= 'z'; c++) {
if (a == b || b == c || c == a) {
// 一人不赛二场
continue;
}
if (a != 'x' && c != 'x' && c != 'z') {
System.out.println("a vs " + (char) a);
System.out.println("b vs " + (char) b);
System.out.println("c vs " + (char) c);
System.out.println("----------------------");
}
}
}
}
}
}

谁考满分?

已知4位同学中的一位数学考了100分,当小李询问这4位是谁考了100分时,4个人的回答如下:

A说:不是我。

B说:是C

C说:是D。

D说:他胡说。

已知三个人说的是真话,一个人说的是假话。现在要根据这些信息,找出考100分的人。

问题分析

A B C D
A 0
B 1
C 1
D 0

关键:四个条件满足其三

package bb;
public class 谁考满分 {
public static int boolToInt(boolean b) {
return b ? 1 : 0;
}
public static void main(String[] args) {
char ret;
char k;
int n = 0;
for (k = 'A'; k <= 'D'; k++) {
ret = k;
// 四个条件满足其三
n = boolToInt(ret != 'A') + boolToInt(ret == 'C') + boolToInt(ret == 'D')
+ boolToInt(ret != 'D');
if (n == 3) {
System.out.println("得100分的是:" + ret);
break;
}
}
}
}

车牌号

一辆汽车撞人后逃跑,4个目击者提供如下线索:

甲说:牌照第三,第四位相同(从左边数起).

乙说:牌号为31xxxx.

丙说:牌照第五,第六位相同(从左边数起).

丁说:第三位~第六位是一个整数的平方.求出此牌照号码

问题分析

1.31aabb

2.aabb=谁的平方?

package bb;
public class 车牌号 {
public static void main(String[] args) {
for (int a = 0; a <= 9; a++) {
for (int b = 0; b <= 9; b++) {
int n = a * 1000 + a * 100 + b * 10 + b;
for (int i = 0; i <= Math.sqrt(n); i++) {
if (i * i == n) {
System.out.println(31 * 10000 + n);
}
}
}
}
}
}

310000

317744

借书

小明有五本新书,要借给A,B,C三位小朋友,若每人每次只能借一本,则可以有多少种不同的借法?

(附加:输出书名)

问题分析

本问题实际上是一个排列问题,即求从5个中取3个进行排列的方法的总数。

首先对五本书从1至5进行编号,然后使用穷举的方法。

假设三个人分别借这五本书中的一本,当三个人所借的书的编号都不相同时,就是满足题意的一种借阅方法。

package bb;
public class 借书 {
public static String getBookName(int key) {
String bookName = "";
switch (key) {
case 1:
bookName = "《三国演义》";
break;
case 2:
bookName = "《西游战记》";
break;
case 3:
bookName = "《水浒全传》";
break;
case 4:
bookName = "《红楼梦醒》";
break;
case 5:
bookName = "《代码大全》";
break;
default:
break;
}
return bookName;
}
public static void main(String[] args) {
int a, b, c, count = 0;
for (a = 1; a <= 5; a++) {
// 第一个人借5本书中的1本:
for (b = 1; b <= 5; b++) {
// 第二个人借5本书中的1本:
for (c = 1; c <= 5; c++) {
// 第三个人借5本书中的1本:
if (c != a && c != b && a != b) {
count++;
System.out.println(count + ":" + getBookName(a) + "," + getBookName(b)
+ "," + getBookName(c));
}
}
}
}
}
}

Java蓝桥杯——逻辑推理练习题的更多相关文章

  1. Java蓝桥杯——递归练习题:走台阶(偶数版)

    递归练习题:走台阶(偶数版) 小明刚刚看完电影<第39级台阶>.离开电影院的时候,他数了数礼堂前的台阶数,恰好是39级! 站在台阶前,他突然又想着一个问题: 如果我每一步只能迈上1个或2个 ...

  2. Java 蓝桥杯 算法训练(VIP) 最大体积

    最大体积 问题描述 每个物品有一定的体积(废话),不同的物品组合,装入背包会战用一定的总体积. 假如每个物品有无限件可用,那么有些体积是永远也装不出来的. 为了尽量装满背包,附中的OIER想要研究一下 ...

  3. Java蓝桥杯练习题——求小数n位后3个数

    求整数除法小数点后第n位开始的3位数 位数不足的补0,如0.125小数第3位后三位:0.12500→500 输入格式:a b n,空格分开,a是被除数,b是除数,n是小数后的位置 输出格式:3位数字, ...

  4. Java蓝桥杯练习题——Huffman树

    Huffman树在编码中有着广泛的应用.在这里,我们只关心Huffman树的构造过程. 给出一列数{pi}={p0, p1, -, pn-1},用这列数构造Huffman树的过程如下: 找到{pi}中 ...

  5. JAVA蓝桥杯黄金分割数,涉及到bigdecimal

    import java.math.BigDecimal; public class test { public static void main(String[] args) { BigDecimal ...

  6. 密码脱落 JAVA 蓝桥杯

    密码脱落 X星球的考古学家发现了一批古代留下来的密码.这些密码是由A.B.C.D 四种植物的种子串成的序列.仔细分析发现,这些密码串当初应该是前后对称的(也就是我们说的镜像串).由于年代久远,其中许多 ...

  7. java 蓝桥杯算法提高 出现次数最多的整数

    思路:其实这道题不是太难,但是这个题太坑了,提交了好多次都不是100,后来才知道,一定一定要在输入数组数据之前先判断一下输进去的n的范围,一定一定要注意,否则就是跟我下面的图片一样的效果了,泪奔~ 问 ...

  8. java 蓝桥杯算法提高 字串统计

    思路:这道题用HashMap来保存枚举的字串,key值保存字串-value值保存字串所出现的次数:         通过for循环并使用subString()方法枚举所有符合要求的子串maxStr记录 ...

  9. java 蓝桥杯算法提高 矩阵乘法

    思路:根据提示的内容,我们可以得到c[i][j] += a[i][k]*b[k][j],k>=0&&k<s PS:这道题本身不难,但是当我定义A[m][s] B[s][n] ...

随机推荐

  1. Docker composer搭建Spring Cloud Alibaba 运行环境(二)

    " Spring Cloud Alibaba要用到的组件很多,注册中心nacos, 限流sentinel, 数据库,网关等等.由于用到的组件相对较多,部署会很繁琐,最关键的是没有资源服务器, ...

  2. SQL Server 列存储索引 第三篇:维护

    列存储索引分为两种类型:聚集的列存储索引和非聚集的列存储索引,在一个表上只能创建一个聚集索引,要么是聚集的列存储索引,要么是聚集的行存储索引,然而一个表上可以创建多个非聚集索引. 一,创建列存储索引 ...

  3. 什么PO模式?

    PO模式PO是Page Object的缩写,PO模式是自动化测试项目开发实践的最佳设计模式之一.核心思想是通过对界面元素的封装减少冗余代码,同时在后期维护中,若元素定位发生变化, 只需要调整页面元素封 ...

  4. [Luogu P2051] [AHOI2009]中国象棋 (状压DP->网格DP)

    题面 传送门:https://www.luogu.org/problemnew/show/P2051 Solution 看到这题,我们不妨先看一下数据范围 30pt:n,m<=6 显然搜索,直接 ...

  5. 微信小程序——【百景游戏小攻略】

    微信小程序--[百景游戏小攻略] 本次课程小项目中的图片以及文章还未获得授权!请勿商用!未经授权,请勿转载! 博客班级 https://edu.cnblogs.com/campus/zjcsxy/SE ...

  6. odbc。INI配置

    [ODBC Data Sources] ST = OSCAR ODBC DRIVER [ST] Driver = /opt/ShenTong/odbc/lib/liboscarodbcw.so Ser ...

  7. 服务器断电导致的ORACLE异常 : ORA-00214 ORA-01033 ORA-01034 ORA-00172 ORA-27101

    工作环境中的集群迁移之后,oracle出了挺多问题,最开始一直没找到原因,后来发现做迁移的人是冷迁移的,且数据库节点是硬关机的,惊了( 表现症状有不能登陆,登录了不能操作等 第一个报的是 ORA-00 ...

  8. 我画着图,FluentAPI 她自己就生成了

    在 Newbe.ObjectVistor 0.3 版本中我们非常兴奋的引入了一个紧张刺激的新特性:使用状态图来生成任意给定的 FluentAPI 设计. 开篇摘要 在非常多优秀的框架中都存在一部分 F ...

  9. 在 JavaScript 中,我们能为原始类型添加一个属性或方法吗?

    原始类型的方法 JavaScript 允许我们像使用对象一样使用原始类型(字符串,数字等).JavaScript 还提供了这样的调用方法.我们很快就会学习它们,但是首先我们将了解它的工作原理,毕竟原始 ...

  10. t分布与t检验的一点理解

    最近又遇到了t分布及t检验方面的内容,发现有些地方自己当初没有很明白,就又查了些资料,加深了一下自己的理解,这里也将自己的一些理解记录下来. 1. 理论基础--大数定理与中心极限定理        在 ...