三个老师问题:已知 A,B,C 3 人是小学老师,各教两门课,互不重复,共有
如下六门课。语文、数学、政治、地理、音乐和美术,已经知道:
–政治老师和数学老师是邻居
–地理老师比语文老师年龄大
–B 最年轻
–A 经常给地理老师和数学老师讲他看过的文学作品
–B 经常和音乐老师、语文老师一起游泳
要求:编程判断 A,B,C 各教哪门课
离散数学布置的上机题,网上大多是6个for循环,这里提供我的思路仅供参考。
package 离散数学;
//0语文 1数学 2政治 3地理 4音乐 5美术
import java.util.ArrayList;
public class 老师任课问题 {
static String str[] = {"语文课","数学课","政治课","地理课","音乐课","美术课"};
static char tc[] = {'A','B','C'};//便于输出结果
static int lesson[] = new int [6];//六门课
static int teacher[] = new int [3];//标记老师是否教了两门课
static ArrayList<Integer> arr = new ArrayList<>();//存储结果
static void dfs(int index) {
if( index == 6) {//六门课搜索完毕,截止条件
if(lesson[2] != lesson[1] && lesson[3] != lesson[0] && lesson[3] != lesson[1] && lesson[3] != 0 && lesson[1] != 0 && lesson[4] != lesson[0] && lesson[4] != 1 && lesson[0] != 1 && lesson[3] != 1) {//根据题目得到的判断式
for ( int i : lesson) {
arr.add(i);
}
}
return;
}
//搜索
else {
for (int j = 0; j < 3; j ++ ) {
if(teacher[j] <= 1) {//如果该老师上的课数小于等于1节课
teacher[j] ++;
lesson[index] = j;
dfs(index + 1);
teacher[j] --;//回溯
}
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
dfs(0);
int k = 0;
for( int i : arr) {
System.out.println(tc[i] + "老师教" + str[k]);
k ++;
}
}
}
输出结果: