• Java蓝桥杯——逻辑推理练习题


    逻辑推理题

    谁是贼?

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

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

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

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

    丁说:“我没有偷”

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

    *问题分析

    假设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+c
    1||!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));
    					}
    				}
    			}
    		}
    	}
    }
    
  • 相关阅读:
    【转】常用插件的使用—grunt入门指南(上)
    基于Cordova的android项目入门
    【转】隐藏元素的子元素隐藏无效
    【转】IE7以下绝对定位被某元素遮挡
    关于“No projects are found to import”的解决方法
    【转】IE6中a标签触发图片和ajax请求被abort
    JS小笔记
    mysql删除重复数据
    国内优秀的团队技术博客
    mysql中的union和order by、limit
  • 原文地址:https://www.cnblogs.com/tigerlion/p/11182889.html
Copyright © 2020-2023  润新知