逻辑推理题

谁是贼?

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

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

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

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

丁说:“我没有偷”

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

*问题分析

假设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:0001for (_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+c==2||!a&&a+b+c!=2
第二个人: b&&a+b+c==1||!b&&a+b+c!=1
第三个人: c&&a+b+c==1||!c&&a+b+c!=1

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

package bb;
public class 诚实族和说谎族 {// 说谎:0// 诚实:1static 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));}}}}}
}

转载于:https://www.cnblogs.com/tigerlion/p/11182889.html

Java蓝桥杯——逻辑推理练习题相关推荐

  1. java逻辑题_Java蓝桥杯——逻辑推理练习题

    逻辑推理题 谁是贼? 公安人员审问四名窃贼嫌疑犯.已知,这四人当中仅有一名是窃贼,还知道这四人中每人要么是诚实的,要么总是说谎.在回答公安人员的问题中: 甲说:"乙没有偷,是丁偷的.&quo ...

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

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

  3. 标题 日期问题java蓝桥杯,日期类的使用(java)-蓝桥杯

    蓝桥杯日期问题常考,java提供了日期类很方便: //日历类 Calendar c = Calendar.getInstance(); // 获取实例化对象 Date date =c.getTime( ...

  4. 蓝桥杯入门练习题斐波那契数列

    蓝桥杯入门练习题 斐波那契数列 #include <stdio.h> #include <stdlib.h>int main() {long long i, j, f1 = 1 ...

  5. java蓝桥杯练习 学做菜

    java蓝桥杯练习 学做菜 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 涛涛立志要做新好青年,他最近在学做菜.由于技术还很生疏,他只会用鸡蛋,西红柿,鸡丁,辣酱这四种原料来做菜, ...

  6. java蓝桥杯练习 蜜蜂飞舞

    java蓝桥杯练习 蜜蜂飞舞 资源限制 时间限制:1.0s 内存限制:512.0MB 问题描述 "两只小蜜蜂呀,飞在花丛中呀--" 话说这天天上飞舞着两只蜜蜂,它们在跳一种奇怪的舞 ...

  7. Java 蓝桥杯 我们的征途是星辰大海

    Java 蓝桥杯 我们的征途是星辰大海 最新的火星探测机器人curiosity被困在了一个二维迷宫里,迷宫由一个个方格组成. 共有四种方格: '.' 代表空地,curiosity可以穿过它 '#' 代 ...

  8. JAVA 蓝桥杯 算法提高 阮小二买彩票

    JAVA 蓝桥杯 算法提高 阮小二买彩票 资源限制 时间限制:1.0s 内存限制:512.0MB 问题描述 在同学们的帮助下,阮小二是变的越来越懒了,连算账都不愿意自己亲自动手了,每天的工作就是坐在电 ...

  9. java蓝桥杯练习 拉马车

    java蓝桥杯练习 拉马车 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 小的时候,你玩过纸牌游戏吗? 有一种叫做"拉马车"的游戏,规则很简单,却很吸引小朋友. ...

最新文章

  1. Open3D面向机器学习的扩展库
  2. 区块链热度背后的资本市场
  3. Java assert关键字
  4. linux解码base64工具,如何解码Linux中的base64编码行?(How do I decode base64 encoded lines in linux?)...
  5. electron——初探
  6. sql数据库常见命令总结
  7. Linux安装和管理程序的相关知识点
  8. 前端学习(1372):构建模块化路由
  9. BlockingQueue详解
  10. OC @class关键字
  11. PPAPI插件与浏览器的通信
  12. python 倒计时库_python实现倒计时小工具
  13. 视频光端机怎么连接 视频光端机接法图解
  14. 图像处理对数变换以及对数变换的拉伸
  15. 域名讲解(一)域名基础概念
  16. Spark学习笔记1
  17. python图片后缀转换---统一转换成.jpg
  18. c语言 eval,分享:自己写的eval函数
  19. SAP-PM设备模块-PM主数据之维护策略
  20. html在背景上自动打字,Js制作点击输入框时默认文字消失的效果

热门文章

  1. create 执行存储过程报错出现符号_记一次数据库迁移的过程采坑过程
  2. nvm 下载node 下载不下来_软件 | 度盘不限速,短视频超清无水印下载,*力解析下载,资源库丰富...
  3. eigrp配置实验_【实验】思科与华为的差别——路由的优选
  4. AWVS14.4.21安装时出现Internet server exception和扫描失败
  5. 数据结构:栈的了解与示例(逆波兰表达式)
  6. java 登陆实例,2021-03-19 java案例:用户登录
  7. 微软最具价值技术专家:我的16年软件开发经验总结
  8. TextView图文混排
  9. SpringBoot之日志记录 SLF4J(H)
  10. php 简易验证码(GD库)