`

告诉你什么是优雅的代码(4)-----智力题的解法(答案)

    博客分类:
  • Java
阅读更多
以下智力题摘自某一帖子。在纸上画了一下之后有了答案。出于职业敏感,开始考虑如何用程序来解决。现在已经有了基本的模型和算法,就等实现。不过,这次不再急于告诉大家什么是优雅的代码,让聪明的你们先来思考一下。实现随后放出。如果帖子过快被隐藏,那么你们又错失一次学习优雅代码的机会了。好了,废话少说,大家一起动脑思考吧。


   1. 6.宴会桌旁  
   2.   
   3.   在某宾馆的宴会厅里,有4位朋友正围桌而坐,侃侃而谈。他们用了中、英、法、日4种语言。现已知:  
   4.   
   5.   A.甲、乙、丙各会两种语言,丁只会一种语言;  
   6.   
   7.   B.有一种语言4人中有3人都会;  
   8.   
   9.   C.甲会日语,丁不会日语,乙不会英语;  
  10.   
  11.   D. 甲与丙、丙与丁不能直接交谈,乙与丙可以直接交谈;  
  12.   
  13.   E. 没有人既会日语,又会法语。  
  14.   
  15.   请问:甲乙丙丁各会什么语言?  



首先,建立一张二维表,如图所示:
*     中  英 法 日
*  甲          
*  乙    
*  丙
*  丁          
某人掌握某语言则标1,不掌握则标0。则问题转化为在表的状态空间下找出符合题中约束的一张表。状态空间的数目为 16*16*16*16,这个数虽然不是天文数字,但效率显然是低下的,编程起来也异常麻烦。
不要急,我们来整理下题中纷乱的约束,重新整理如下:

  甲: 会日语,会两种语言,不会法语
  乙: 不会英语,会两种语言,不同时会日语和法语
  丙: 会两种语言,不同时会日语和法语
  丁: 不会日语,只会一种语言

  全局约束:甲与丙、丙与丁不能直接交谈,乙与丙可以直接交谈,有一种语言4人中有3人都会

Ok,现在二维表的状态如下:
       中  英  法  日
   甲                1
   乙     0
   丙
   丁                0
先忽略全局约束,根据各人的约束,则状态空间变为(其中c(a,b)是组合数):
(c(3,1) - 1) * (c(3,2) - 1) * (c(4,2)-1)*c(3,1) = 2*2*5*3 = 60
显然非常少了。接下来我们只要在这个状态空间下寻找出满足全局约束的状态就可以了。

就在我准备用二维数组来实现的时候,一个火花在脑中突然迸发。那就是按位与运算。我们来看下与运算:

1001&1100 = 1000  0010&0101 = 0000

看出端倪了吗?两个人如果能互相交流证明其状态按位与的结果不为0,否则则为0.

于是一个优雅的方案浮出水面:

/*
 *   A.甲、乙、丙各会两种语言,丁只会一种语言;  
#   
#   B.有一种语言4人中有3人都会;  
#   
#   C.甲会日语,丁不会日语,乙不会英语;  
#   
#   D. 甲与丙、丙与丁不能直接交谈,乙与丙可以直接交谈;  
#   
#   E. 没有人既会日语,又会法语。  
 
 *
 *分析
 *  甲: 会日语,会两种语言,不会法语
 *  乙: 不会英语,会两种语言,不同时会日语和法语
 *  丙: 会两种语言,不同时会日语和法语
 *  丁: 不会日语,只会一种语言
 *  全局约束:甲与丙、丙与丁不能直接交谈,乙与丙可以直接交谈,有一种语言4人中有3人都会
 *  
 *     8   4 2  1
 *     中  英 法 日 
 *  甲           1
 *  乙     0
 *  丙
 *  丁           0
 */
public class Fun {
	public static void main(String[] args) {
		
		int[] a = {9,5};
		int[] b = {10,9};
		int[] c = {5,6,9,10,12};
		int[] d = {8,4,2};
		boolean solved = false;
		
		for (int i = 0; i < a.length&&!solved; i++) {
			
			
			for (int j = 0; j < b.length&&!solved; j++) {
				
				
				for (int k = 0; k < c.length&&!solved; k++) {
					//甲与丙不能直接交谈
					if((a[i]&c[k]) != 0 )
						continue;
					//乙与丙可以直接交谈
					if((b[j]&c[k]) == 0)
						continue;
					
					for (int l = 0; l < d.length; l++) {
						//丙与丁不能直接交谈
						if((c[k]&d[l]) != 0)
							continue;
						//有一种语言4人中有3人都会
						if((a[i]&b[j]&c[k])!=0 || (a[i]&b[j]&d[l])!=0 || (a[i]&c[k]&d[l])!=0
						|| (b[j]&c[k]&d[l])!=0 ){
							
							System.out.print("甲:");
							parse(a[i]);
							System.out.println();
							System.out.print("乙:");
							parse(b[j]);
							System.out.println();
							System.out.print("丙:");
							parse(c[k]);
							System.out.println();
							System.out.print("丁:");
							parse(d[l]);
							System.out.println();
							solved = true;
							break;
						}
					}
				}
			}
		}
		
	}

	private static void parse(int num) {
		while(num!=0){
			if(num >= 8){
				System.out.print(" 中 ");
				num -= 8;
			}
			else if(num >= 4){
				System.out.print(" 英 ");
				num -= 4;
			}
			else if(num >= 2){
				System.out.print(" 法 ");
				num -= 2;
			}
			else{
				System.out.print(" 日 ");
				num -= 1;
			}
		}
		
	}
}








5
4
分享到:
评论
16 楼 wfm0105 2016-02-04  
daisy_rainbow 写道
       
不懂这些数组里面的值是什么意义??

        int[] a = {9,5}; 
        int[] b = {10,9}; 
        int[] c = {5,6,9,10,12}; 
        int[] d = {8,4,2}; 



补全下作者的2维图你就会明白,这些数组代表什么了

       8   4 2  1
*     中  英 法 日 
*  甲         0  1
*  乙     0
*  丙            0
*  丁            0

a 数组代表 甲会的语言,8+1或者4+1 ,乙丙丁 以此类推


解释不到位不要喷。


15 楼 daisy_rainbow 2015-02-27  
       
不懂这些数组里面的值是什么意义??

        int[] a = {9,5}; 
        int[] b = {10,9}; 
        int[] c = {5,6,9,10,12}; 
        int[] d = {8,4,2}; 
14 楼 tonly85 2010-10-05  
先不考虑代码,和题目逻辑。用中国人的想法,题目既然中国人出的,会的人最多的那种语言肯定是中文。
13 楼 yangguo 2010-09-26  
zhao103804 写道
我只是推算出来了,并未写成程序,不知对否
甲:中日
乙:中法
丙:英法
丁:法

错了,你的丙与丁可以直接交流。代码已贴出,自己跑下。
12 楼 yangguo 2010-09-26  
Sweegi 写道
留言啦~到处学习学习


代码已贴出。
11 楼 Sweegi 2010-09-26  
留言啦~到处学习学习
10 楼 zhao103804 2010-09-25  
我只是推算出来了,并未写成程序,不知对否
甲:中日
乙:中法
丙:英法
丁:法
9 楼 VeeSong 2010-09-22  
留言就能看到吗?
8 楼 yangguo 2010-09-19  
ge_cc 写道
想看看  ·

已发。
7 楼 ge_cc 2010-09-19  
想看看  ·
6 楼 lzxz1234 2010-09-15  
我要代码,楼主发给我吧,谢了
5 楼 yangguo 2010-09-10  
mqlfly2008 写道
画图我会了,但要写成程序,还没想出来,等待哥们的优雅代码

代码已经发放过了。你来迟了。要的话我发你。
4 楼 mqlfly2008 2010-09-10  
画图我会了,但要写成程序,还没想出来,等待哥们的优雅代码
3 楼 yangguo 2010-09-09  
那你不妨拿出来show show.
2 楼 tangchj 2010-09-09  
俺也实现了一种,思路基本一致,方式略有不同
1 楼 xiaoxiaoniao 2010-09-08  

这种题锻炼脑子,
找到大学时的感觉了。

喜欢

相关推荐

    面试常见智力题(逻辑分析题及答案)

    面试常见智力题(逻辑分析题及答案) 本资源摘要信息将对面试常见智力题进行详细的分析和解释,涵盖逻辑分析题及答案,旨在帮助读者更好地理解和掌握逻辑分析能力。 一、面试常见智力题 面试常见智力题是指在面试...

    大公司面试智力题集锦

    大公司面试智力题集锦

    各大名企笔试面试智力题附答案汇总

    ### 各大名企笔试面试智力题解析 #### 海盗分金币问题解析 这个问题是经典的博弈论题目,考察的是参与者的逻辑思维能力和对博弈论的理解。题目设定在一个假设的情境下,五个海盗通过抽签决定分配顺序,然后根据...

    常见的面试智力题与答案

    ### 常见的面试智力题与答案解析 在求职过程中,面试官常常会通过一些智力题来评估应聘者的逻辑思维能力、问题解决能力和创新能力。本文将对一系列常见面试智力题进行详细解析,并给出答案,帮助大家更好地准备面试...

    经典数学智力题大全附答案

    经典数学智力题大全附答案

    毕业生找工作常见智力题及答案

    ### 毕业生找工作常见智力题及答案解析 对于即将步入职场的毕业生而言,面试中的智力题常常成为一道难以逾越的门槛。这类题目旨在考察求职者的逻辑思维能力、解决问题的能力以及创新思维等多方面素质。下面我们将...

    46家企业笔试-经典智力题

    这些题目是来自46家不同公司的笔试题,涵盖了编程、逻辑和算法等方面,旨在测试面试者的智力和编程能力。下面是对这些题目详细解答: 1. Sony 笔试题 - 完成程序 这是一个打印星号(*)的图案,每行的星号数量按照等...

    100道逻辑智力题及答案

    根据给定的信息,我们可以从这些逻辑智力题目中提取并总结出一些重要的知识点: ### 1. 数学逻辑问题 #### 题目示例: - 一个家庭有两兄弟,年龄分别为2岁、2岁、9岁;另一个家庭有两兄弟,年龄分别为32岁。问:两...

    收藏微软面试智力题 (附答案).txt

    根据提供的文件信息,可以看出这是一份包含了多个微软面试智力题目的文档。虽然原文中的内容较为杂乱且不易理解,但可以从中提取出一些关键的问题,并尝试解析这些题目背后的知识点。 ### 微软面试智力题解析 ####...

    智力400题及逻辑测试题(笔试面试时经常会遇到的智力题)(附有答案)

    智力测试和逻辑题是企业在招聘过程中常常用于评估应聘者思维能力、问题解决能力和创新思考的重要环节。这些题目旨在考察候选人的逻辑推理、空间想象、数字敏感度、问题解决技巧以及快速学习的能力。以下是对这些测试...

    75道经典面试智力题及答案

    ### 经典面试智力题解析 #### 题目1:如何使用5升和6升的水壶取得3升的水? **解析:** 这个问题考验的是逻辑思维能力和数学推理能力。解题步骤如下: 1. **第一步:**将6升水壶装满水。 2. **第二步:**将6升...

    程序员有趣的面试智力题及答案.pdf,这是一份不错的文件

    "程序员有趣的面试智力题及答案.pdf" 这是一份关于程序员面试的智力题及答案的PDF文件,包含11道智力题,涵盖了算法、数据结构、逻辑思维等方面的知识点。 问题1:双人游戏策略 考虑一个双人游戏,游戏在一个圆桌...

    计算机笔试面试常见的智力题

    笔试常见的智力题:你让工人为你工作7天,给工人的回报是一根金条。金条平分成相连的7段;为什么下水道的盖子是圆的;有7克、2克砝码各一个,天平一只,如何只用这些物品三次将140克的盐 分成50、90克各一份;

    笔试 面试 智力题 求职

    在求职过程中,笔试和面试是两个至关重要的环节,智力题的出现则往往能评估候选人的逻辑思维、问题解决和创新能力。这些题目不仅测试了应聘者的专业知识,还考察了他们在压力下的反应速度和应对复杂问题的能力。下面...

    面试必须-趣味面试智力题

    小蒲的解法是将金条分成1/7、2/7和4/7三份。按照这个方案,他可以在每一天结束时给出相应份额,确保在不违反规则的情况下完成支付。 这个问题展示了分治法的思维,即通过将大问题分解为小问题来解决。在实际工作中...

    找工作中可能的智力题合集大全

    各种笔试智力题吧,几百道吧 _760B_笔试常见的智力题 13道经典智力题及其答案 20智力题 测智力题 经典智力题 智力题.exe 智力题.pdf 智力题.txt 智力题--★【汉魅HanMei—就业指导分享】 智力题合集

    比奈-西蒙智力测量量表(附答案).doc

    比奈-西蒙智力测量量表(附答案).doc

    java面试宝典 试题 智力题

    本宝典不仅包含基础的Java语法、面向对象设计、数据结构与算法等核心知识点,还涉及智力题和薪水谈判策略,为求职者提供了全方位的面试指南。 1. **Java基础** - **语法**:深入理解基本语法,如变量声明、数据...

Global site tag (gtag.js) - Google Analytics