Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3702
  • 博文数量: 2
  • 博客积分: 85
  • 博客等级: 民兵
  • 技术积分: 45
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-13 12:26
文章分类
文章存档

2012年(2)

我的朋友
最近访客

分类: Java

2012-07-13 19:51:27

原题如下:
甲乙丙丁4个人,穿4种颜色的衣服(red,blue,black,white),
分处4种不同的年龄阶段(20,30,40,50),住在4个不同的
城市(wuhan,wuxi,beijing,yantai),满足以下条件:
1、甲是第二大,丙比丁小
2、乙讨厌red颜色衣服,甲和丁都喜欢穿red和black颜色衣服
3、丙喜欢住yantai和wuxi,乙不喜欢beijing
问:这四人分别穿什么衣服,多大,住哪里?(将所有可能的组合都输出)



对一个人来说,有4中衣服,4种年龄,4个城市
所有的可能性有4*4*4*4=256种
把所有的组合可能放在一个集合中去备用



对4个人来说,每个人有上述256种可能
本想把四个人的排列可能性也存到一个集合中
然后遍历整个集合判断是否符合条件
但是四个人足足有256^4种可能
java给我报错内存不足

只好每生成一种可能就判断一下
判断成功的才加入集合中
这里把判断方法放在静态方法中去了
后来想想应该放到4个人的可能性的类中去
失策了

最终结果输出了一大堆90+个
没有自信全数没有遗漏
但是大体的方法应该正确
代码如下:

点击(此处)折叠或打开

  1. /**
  2.  * PaiLie.java
  3.  * 2012-7-13
  4.  */
  5. package exam;

  6. import java.util.HashSet;
  7. import java.util.Set;

  8. /*
  9.  * * 甲乙丙丁4个人,穿4种颜色的衣服(red,blue,black,white),
  10.  * 分处4种不同的年龄阶段(20,30,40,50),住在4个不同的
  11.  * 城市(wuhan,wuxi,beijing,yantai),满足以下条件:
  12.  * 1、甲是第二大,丙比丁小
  13.  * 2、乙讨厌red颜色衣服,甲和丁都喜欢穿red和black颜色衣服
  14.  * 3、丙喜欢住yantai和wuxi,乙不喜欢beijing
  15.  * 问:这四人分别穿什么衣服,多大,住哪里?(将所有可能的组合都输出)
  16. */

  17. /**
  18.  * 表示其中一个人的某种可能性
  19.  * @author xiaoming
  20.  */
  21. class KeNeng
  22. {
  23.     public int YiFu;        //衣服,1234分别表示red,blue,black,white
  24.     public int Age;        //年龄,1234分别表示20,30,40,50
  25.     public int City;        //城市,1234分别表示wuhan,wuxi,beijing,yantai
  26.     /**
  27.      * 构造函数
  28.      * @param yiFu
  29.      * @param age
  30.      * @param city
  31.      */
  32.     public KeNeng(int yiFu, int age, int city) {
  33.         YiFu = yiFu;    
  34.         Age = age;    
  35.         City = city;    
  36.     }
  37.     /**
  38.      * 输出自己的数据
  39.      */
  40.     public void print() {
  41.         String yifu="";
  42.         switch(YiFu)
  43.         {
  44.         case 1: yifu="red";break;
  45.         case 2: yifu="blue";break;
  46.         case 3: yifu="black";break;
  47.         case 4: yifu="white";break;
  48.         }
  49.         String age="";
  50.         switch(Age)
  51.         {
  52.         case 1: age="20";break;
  53.         case 2: age="30";break;
  54.         case 3: age="40";break;
  55.         case 4: age="50";break;
  56.         }
  57.         String city="";
  58.         switch(City)
  59.         {
  60.         case 1: city="wuhan";break;
  61.         case 2: city="wuxi";break;
  62.         case 3: city="beijing";break;
  63.         case 4: city="yantai";break;
  64.         }
  65.         System.out.println("衣服颜色="+yifu+"\t年龄="+age+"\t城市="+city);
  66.     }
  67.     
  68.     
  69. }

  70. /**
  71.  * 表示四个人排列的可能性
  72.  * @author xiaoming
  73.  */
  74. class KeNeng4
  75. {
  76.     public KeNeng Jia;        //甲
  77.     public KeNeng Yi;            //乙
  78.     public KeNeng Bing;        //丙
  79.     public KeNeng Ding;    //丁
  80.     /**
  81.      * 构造函数
  82.      * @param jia
  83.      * @param yi
  84.      * @param bing
  85.      * @param ding
  86.      */
  87.     public KeNeng4(KeNeng jia, KeNeng yi, KeNeng bing, KeNeng ding) {
  88.         Jia = jia;
  89.         Yi = yi;
  90.         Bing = bing;
  91.         Ding = ding;
  92.     }
  93.     /**
  94.      * 显示自己的数据
  95.      */
  96.     public void print() {
  97.         System.out.print("甲的数据:");
  98.         Jia.print();
  99.         System.out.print("乙的数据:");
  100.         Yi.print();
  101.         System.out.print("丙的数据:");
  102.         Bing.print();
  103.         System.out.print("丁的数据:");
  104.         Ding.print();
  105.         System.out.println();
  106.     }

  107. }


  108. /**
  109.  * 输出所有的可能组合
  110.  * @author xiaoming
  111.  */
  112. public class PaiLie
  113. {
  114.         

  115.     public static void main(String[] args) {
  116.         
  117.         //一个用以存放某个人三项属性所有可能的集合
  118.         Set<KeNeng> keNengs=new HashSet<KeNeng>();

  119.         for(int yifu=1;yifu<=4;yifu++)//四种衣服
  120.             for(int age=1;age<=4;age++)//四种年龄
  121.                 for(int city=1;city<=4;city++)//四个城市
  122.                     keNengs.add(new KeNeng(yifu,age,city));
  123.         
  124.         //一个用以存放四个人所有可能的集合
  125.         Set<KeNeng4> keNeng4s=new HashSet<KeNeng4>();
  126.         
  127.         Object[] ArykeNengs=keNengs.toArray();
  128.         for(int jia=0;jia<ArykeNengs.length;jia++)//让甲遍历各种可能
  129.             for(int yi=0;yi<ArykeNengs.length;yi++)//让乙遍历各种可能
  130.                 for(int bing=0;bing<ArykeNengs.length;bing++)//让丙遍历各种可能
  131.                     for(int ding=0;ding<ArykeNengs.length;ding++)//让丁遍历各种可能
  132.                     {
  133.                         KeNeng4 k4 =new KeNeng4(
  134.                                 (KeNeng)ArykeNengs[jia],
  135.                                 (KeNeng)ArykeNengs[yi],
  136.                                 (KeNeng)ArykeNengs[bing],
  137.                                 (KeNeng)ArykeNengs[ding] );
  138.                         if(check(k4))
  139.                             keNeng4s.add(k4);
  140.                     }
  141.         
  142.         //输出
  143.         for(KeNeng4 k:keNeng4s)
  144.         {
  145.             k.print();
  146.         }
  147.         System.out.println("总计的可能性个数:"+keNeng4s.size());
  148.     }

  149.     /**
  150.      * 判断一组可能性是否符合条件
  151.      * @param k4
  152.      * @return 符合条件与否
  153.      */
  154.     private static boolean check(KeNeng4 k4) {

  155.         //四个人的单项属性不能有重复的
  156.         //重复的话属性值相乘得1*2*3*4和属性相加得1+2+3+4不可能同时成立
  157.         if(k4.Jia.Age*k4.Yi.Age*k4.Bing.Age*k4.Ding.Age!=1*2*3*4)
  158.             return false;
  159.         if(k4.Jia.YiFu*k4.Yi.YiFu*k4.Bing.YiFu*k4.Ding.YiFu!=1*2*3*4)
  160.             return false;
  161.         if(k4.Jia.City*k4.Yi.City*k4.Bing.City*k4.Ding.City!=1*2*3*4)
  162.             return false;
  163.         if(k4.Jia.Age+k4.Yi.Age+k4.Bing.Age+k4.Ding.Age!=1+2+3+4)
  164.             return false;
  165.         if(k4.Jia.YiFu+k4.Yi.YiFu+k4.Bing.YiFu+k4.Ding.YiFu!=1+2+3+4)
  166.             return false;
  167.         if(k4.Jia.City+k4.Yi.City+k4.Bing.City+k4.Ding.City!=1+2+3+4)
  168.             return false;
  169.         //甲是第二大,也就是40岁喽
  170.         if(k4.Jia.Age!=3)
  171.             return false;
  172.         //丙比丁小
  173.         if(k4.Bing.Age>=k4.Ding.Age)
  174.             return false;
  175.         //乙讨厌red颜色
  176.         if(k4.Yi.YiFu==1)
  177.             return false;
  178.         //甲和丁都喜欢穿red和black衣服
  179.         if(k4.Jia.YiFu!=1 && k4.Jia.YiFu!=3)
  180.             return false;
  181.         if(k4.Ding.YiFu!=1 && k4.Ding.YiFu!=3)
  182.             return false;
  183.         //丙喜欢住烟台和无锡
  184.         if(k4.Bing.City!=2 && k4.Bing.City!=4)
  185.             return false;
  186.         //乙不喜欢北京
  187.         if(k4.Yi.City==3)
  188.             return false;
  189.         return true;
  190.     }

  191. }

阅读(1029) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~