逻辑推理题

谁是贼?

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

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

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

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

丁说:“我没有偷”

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

*问题分析

假设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. 打造跨平台.NET Core后台服务

    续之前讲的在TopShelf上部署ASP.NET Core程序,作为后台服务运行,自从.NET Core 3.0出现以后,出现了自带的Generic Host,使得自托管服务变为可能.这种方式和Top ...

  2. SpringBoot + Swagger Demo

    Swagger是什么? Swagger 是一个规范且完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.  Swagger 的目标是对 REST API 定义一个标准且和语 ...

  3. SQL Server 列存储索引概述

    第一次接触ColumnStore是在2017年,数据库环境是SQL Server 2012,Microsoft开始在SQL Server 2012中推广列存储索引,到现在的SQL Server 201 ...

  4. Java学习的第十天

    1.类方法 实例方法 自定义方法 2.今天使用visio不太会使用,方法覆盖不懂. 3.明天将方法剩余部分学完

  5. P2966 [USACO09DEC]Cow Toll Paths G

    题意描述 Cow Toll Paths G 这道题翻译的是真的不错,特别是第一句话 给定一张有 \(n\) 个点 \(m\) 条边的无向图,每条边有边权,每个点有点权. 两点之间的路径长度为所有边权 ...

  6. POI做题记录

    嘿嘿,偷学一波! 由于博主做的题比较少,所以没按年份整理,直接按照做题时间放上来了. 2020年9月20日 [POI2013]LUK-Triumphal arch 给你一颗\(n\)个点的树(\(n\ ...

  7. day87:luffy:结算页面积分&支付宝接口

    目录 1.积分 2.支付 1.积分 1.关于积分的表结构 1.在user表中添加credit字段 + 设计一个积分的表结构 user/models.py class User(AbstractUser ...

  8. CORS跨域请求:前后端分离

    1. 请求过滤器: /** * OncePerRequestFilter保证在任何Servlet容器中都是一个请求只执行一次的过滤器. */ public class CorsFilter exten ...

  9. lua调用dll demo

    使用的是lua5.3 DllMain.cpp 1 //生成的dll 是 lua_add53.dll 2 //luaopen_lua_add 3 extern "C" { 4 #in ...

  10. java 基础知识(java web 方面的)

    1.java面向对象的基本特征:封装性,多态性,继承性. 2.Java的泛型:iterator接口主要有hasnext()方法,next()方法,remove()方法:collection接口继承了i ...