原题如下:
甲乙丙丁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+个
没有自信全数没有遗漏
但是大体的方法应该正确
代码如下:
- /**
- * PaiLie.java
- * 2012-7-13
- */
- package exam;
- import java.util.HashSet;
- import java.util.Set;
- /*
- * * 甲乙丙丁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
- * 问:这四人分别穿什么衣服,多大,住哪里?(将所有可能的组合都输出)
- */
- /**
- * 表示其中一个人的某种可能性
- * @author xiaoming
- */
- class KeNeng
- {
- public int YiFu; //衣服,1234分别表示red,blue,black,white
- public int Age; //年龄,1234分别表示20,30,40,50
- public int City; //城市,1234分别表示wuhan,wuxi,beijing,yantai
- /**
- * 构造函数
- * @param yiFu
- * @param age
- * @param city
- */
- public KeNeng(int yiFu, int age, int city) {
- YiFu = yiFu;
- Age = age;
- City = city;
- }
- /**
- * 输出自己的数据
- */
- public void print() {
- String yifu="";
- switch(YiFu)
- {
- case 1: yifu="red";break;
- case 2: yifu="blue";break;
- case 3: yifu="black";break;
- case 4: yifu="white";break;
- }
- String age="";
- switch(Age)
- {
- case 1: age="20";break;
- case 2: age="30";break;
- case 3: age="40";break;
- case 4: age="50";break;
- }
- String city="";
- switch(City)
- {
- case 1: city="wuhan";break;
- case 2: city="wuxi";break;
- case 3: city="beijing";break;
- case 4: city="yantai";break;
- }
- System.out.println("衣服颜色="+yifu+"\t年龄="+age+"\t城市="+city);
- }
-
-
- }
- /**
- * 表示四个人排列的可能性
- * @author xiaoming
- */
- class KeNeng4
- {
- public KeNeng Jia; //甲
- public KeNeng Yi; //乙
- public KeNeng Bing; //丙
- public KeNeng Ding; //丁
- /**
- * 构造函数
- * @param jia
- * @param yi
- * @param bing
- * @param ding
- */
- public KeNeng4(KeNeng jia, KeNeng yi, KeNeng bing, KeNeng ding) {
- Jia = jia;
- Yi = yi;
- Bing = bing;
- Ding = ding;
- }
- /**
- * 显示自己的数据
- */
- public void print() {
- System.out.print("甲的数据:");
- Jia.print();
- System.out.print("乙的数据:");
- Yi.print();
- System.out.print("丙的数据:");
- Bing.print();
- System.out.print("丁的数据:");
- Ding.print();
- System.out.println();
- }
- }
- /**
- * 输出所有的可能组合
- * @author xiaoming
- */
- public class PaiLie
- {
-
- public static void main(String[] args) {
-
- //一个用以存放某个人三项属性所有可能的集合
- Set<KeNeng> keNengs=new HashSet<KeNeng>();
- for(int yifu=1;yifu<=4;yifu++)//四种衣服
- for(int age=1;age<=4;age++)//四种年龄
- for(int city=1;city<=4;city++)//四个城市
- keNengs.add(new KeNeng(yifu,age,city));
-
- //一个用以存放四个人所有可能的集合
- Set<KeNeng4> keNeng4s=new HashSet<KeNeng4>();
-
- Object[] ArykeNengs=keNengs.toArray();
- for(int jia=0;jia<ArykeNengs.length;jia++)//让甲遍历各种可能
- for(int yi=0;yi<ArykeNengs.length;yi++)//让乙遍历各种可能
- for(int bing=0;bing<ArykeNengs.length;bing++)//让丙遍历各种可能
- for(int ding=0;ding<ArykeNengs.length;ding++)//让丁遍历各种可能
- {
- KeNeng4 k4 =new KeNeng4(
- (KeNeng)ArykeNengs[jia],
- (KeNeng)ArykeNengs[yi],
- (KeNeng)ArykeNengs[bing],
- (KeNeng)ArykeNengs[ding] );
- if(check(k4))
- keNeng4s.add(k4);
- }
-
- //输出
- for(KeNeng4 k:keNeng4s)
- {
- k.print();
- }
- System.out.println("总计的可能性个数:"+keNeng4s.size());
- }
- /**
- * 判断一组可能性是否符合条件
- * @param k4
- * @return 符合条件与否
- */
- private static boolean check(KeNeng4 k4) {
- //四个人的单项属性不能有重复的
- //重复的话属性值相乘得1*2*3*4和属性相加得1+2+3+4不可能同时成立
- if(k4.Jia.Age*k4.Yi.Age*k4.Bing.Age*k4.Ding.Age!=1*2*3*4)
- return false;
- if(k4.Jia.YiFu*k4.Yi.YiFu*k4.Bing.YiFu*k4.Ding.YiFu!=1*2*3*4)
- return false;
- if(k4.Jia.City*k4.Yi.City*k4.Bing.City*k4.Ding.City!=1*2*3*4)
- return false;
- if(k4.Jia.Age+k4.Yi.Age+k4.Bing.Age+k4.Ding.Age!=1+2+3+4)
- return false;
- if(k4.Jia.YiFu+k4.Yi.YiFu+k4.Bing.YiFu+k4.Ding.YiFu!=1+2+3+4)
- return false;
- if(k4.Jia.City+k4.Yi.City+k4.Bing.City+k4.Ding.City!=1+2+3+4)
- return false;
- //甲是第二大,也就是40岁喽
- if(k4.Jia.Age!=3)
- return false;
- //丙比丁小
- if(k4.Bing.Age>=k4.Ding.Age)
- return false;
- //乙讨厌red颜色
- if(k4.Yi.YiFu==1)
- return false;
- //甲和丁都喜欢穿red和black衣服
- if(k4.Jia.YiFu!=1 && k4.Jia.YiFu!=3)
- return false;
- if(k4.Ding.YiFu!=1 && k4.Ding.YiFu!=3)
- return false;
- //丙喜欢住烟台和无锡
- if(k4.Bing.City!=2 && k4.Bing.City!=4)
- return false;
- //乙不喜欢北京
- if(k4.Yi.City==3)
- return false;
- return true;
- }
- }
阅读(1029) | 评论(0) | 转发(0) |