A、B、C是小学老师,各教2门课,互不重复。共有如下6门课:语文、算术、政治、地理、音乐和美术。
已知: (1)政治老师和算术老师是邻居。 (2)地理老师比语文老师年龄大。 (3)B最年轻。
(4)A经常对地理老师和算术老师讲他看过的文学作品。 (5)B经常和音乐老师、语文老师一起游泳。
最后结果是:A教授语文,政治。B教授算术,美术。C教授地理,音乐
已知: (1)政治老师和算术老师是邻居。 (2)地理老师比语文老师年龄大。 (3)B最年轻。
(4)A经常对地理老师和算术老师讲他看过的文学作品。 (5)B经常和音乐老师、语文老师一起游泳。
请编程输出A、B、C各教哪两门课。
分析:首先要得到所有可能的组合,一共有6*5*4*3*2/(2*2*2)种。
然后根据已知的3个条件进行排除,最后得到一种情况。
那么如何获得所有可能的组合呢?
这里我采用了一个StringBuffer = “000000”,
然后使用1,2,3,4,5,6分别代表各个课程,“123456”和“654321”自然是不同的组合,abc3位教师按照顺序对于各自的2门课程。
如321546代表着,教师A教授政治,算术,教师B教授语文,音乐,教师C教授地理和美术。
然后用随机数确定1,2,3,4,5,6的位置,如果相应的位置的字符不为0,代表着这个位置已经被占用,需要重新随机。直到6个字符全部分配到正确的位置。
public boolean putString(StringBuffer s, int i, char c) {
if (s.charAt(i) != '0') {
return false;
}
s.setCharAt(i, c);
return true;
}
while (set.size() < 6 * 5 * 4 * 3 * 2/8) {
index = new StringBuffer("000000");
do {
i = 0;
i = random.nextInt(6);
} while (!putString(index, i, '1'));
do {
i = 0;
i = random.nextInt(6);
} while (!putString(index, i, '2'));
do {
i = 0;
i = random.nextInt(6);
} while (!putString(index, i, '3'));
do {
i = 0;
i = random.nextInt(6);
} while (!putString(index, i, '4'));
do {
i = 0;
i = random.nextInt(6);
} while (!putString(index, i, '5'));
do {
i = 0;
i = random.nextInt(6);
} while (!putString(index, i, '6'));
replaceIndex(index);
set.add(index.toString());
}
这里存在一个问题,随机产生的顺序比如123456和214365和213456等等显然是不同的,但是却都归为一种情况,因为一位教师教2门课。
那么如何剔除重复的情况呢?
这里是把得到的字符串进行排序,确保只有一种情况。
public void replaceIndex(StringBuffer s){
char first ;
char last;
for(int i = 0;i<s.length();i = i+2){
first = s.charAt(i);
last = s.charAt(i+1);
if(first>last){
s.setCharAt(i, last);
s.setCharAt(i+1, first);
}
}
}
这样就可以了。
最后只需要按照条件进行判断就可以了:
for(String s:set){
if(s.indexOf("23") == 0 ||s.indexOf("23") == 2 || s.indexOf("23") == 4){//条件1
continue;
}
if(s.indexOf("14") == 0 ||s.indexOf("23") == 2 || s.indexOf("23") == 4){//条件2
continue;
}
if(s.indexOf("4") == 2 ||s.indexOf("4") == 3 ){//条件3
continue;
}
if(s.indexOf("2") == 0 ||s.indexOf("23") == 1 || s.indexOf("4") == 0|| s.indexOf("4") == 1){//条件4
continue;
}
if(s.indexOf("1") == 2 ||s.indexOf("1") == 3 || s.indexOf("5") == 2|| s.indexOf("5") == 3){//条件5
continue;
}
str = s;
}
最后结果是:A教授语文,政治。B教授算术,美术。C教授地理,音乐