题目:A,B,C,D,E5人为某次竞赛的前5名,他们在名次公布前猜名次。
A说: B得第三名,C得第五名
B说: D得第二名,E得第四名
C说:B得第一名, E得第四名
D说: C得第一名,B得第二名
E说: D得第二名,A得第三名
每个人都猜对了一半,实际名次是什么呢?
做算法作业,算法教科书里讲过类似的题,但是示例代码十分无脑,直接暴力枚举,有几个人就叠几个for循环不断轮询条件,不想用。
想搞点尝试,发现5人竞猜的情况可以用一个二维数组来表示,实际名次可以放在长度为5的数组result里,而至于如何让程序由"猜对了一半"的条件去破解出实际名次,我的方法是:先让程序假设某一个人X(X=a|b|c|d|e)对i(i=a|b|c|d|e)的猜测是正确的,由此推出X以外其他人对i的猜测是错误的(同时X的另一猜测是错误的),然后基于这个猜测去继续假设后面各人的猜测结果,然后检测result的和是不是15(所有名次的和是15)来筛选出正确答案。
我也回到了枚举上,一时想不到更好的方法,但总比不看条件暴力枚举要高端。
毕竟学生要赶作业,第一天二维数组写好了伪代码后,第二天根据伪代码开干,结果发现自己程序对于怎么弄result这部分其实根本没涉及,傻眼了。
然后再次返回自己写的草稿,突然一惊:这竞猜结果尼玛就是遍历2叉树啊!(是什么算法给忘了,好像是深度遍历,又觉得不像,就是从根从上往下遍历各结点)
前功尽弃,此时我光把其他题的伪代码实现一遍加调试的时间已经影响到我的其他学习计划了,不怎么想做了,故求思路,要是能有示例代码就更好了,谢谢。
草稿部分:
我的理解也是简单的遍历,不过是这样的
每个人有两个说法,那么就是0或1,总共有5个人,那么就是2^5=32。
第一种说法就是:00000,第二种说法就是00001,最后一种说法就是:11111
遍历00000 到 11111 中的32个说法,判断哪个是符合情况的。
用一个list存1,2,3,4存ABCD
再写一个list存ABCD说的话的规则,写循环去判断所有人说的话,而且说的二句只能有一个是真,一年验证完成即可。