告诉你什么是优雅的代码(4)-----智力题的解法(答案)
以下智力题摘自某一帖子。在纸上画了一下之后有了答案。出于职业敏感,开始考虑如何用程序来解决。现在已经有了基本的模型和算法,就等实现。不过,这次不再急于告诉大家什么是优雅的代码,让聪明的你们先来思考一下。实现随后放出。如果帖子过快被隐藏,那么你们又错失一次学习优雅代码的机会了。好了,废话少说,大家一起动脑思考吧。
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. 请问:甲乙丙丁各会什么语言?
/* * 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;}}}}