经典编程题-ABC各教那门课

A、B、C是小学老师,各教2门课,互不重复。共有如下6门课:语文、算术、政治、地理、音乐和美术。
已知: (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教授地理,音乐

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值