有这样的一个算法,是一个比赛的流程(单循环赛),比如说有A,B,C,D,E,F六个人,每个人都要互相打过,比如说,这个星期是AB,CD,EF.那么下个星期是AF,BC,DE.下个星期就是…….
我的思路是这样的,先根据人的个数,我把所有的组合分别放在数组X和数组Y中,然后,从数组X中任取一个组合,比如说是AB,然后把数组X中所有含有A,B的组合都干掉,数组X中就只有{CD,CE,CF,DE,DF,EF},然后重复上面的动作,直到数组中只有最后两个(先不考虑奇数情况).然后输出.
接下去从数组Y中把输出的组合去掉,然后再赋给数组X,让数组X重复上面的动作,直到最后,数组Y中没有同一个字母出现.这样的话,会出现意外情况,
比如我理想的状态是
AB,CD,EF
AC,BE,DF,
AD,BF,CE
AE,CF,BD
AF,BC,DE
但是有时候会多出一场,比如说:
AB,CD,EF
AC,BE,DF,
AD,BF,CE
AE,BC
AF,BD
DE,CF
请教下,不知道怎么处理,有没有好的酸法避免这种情况?

解决方案 »

  1.   

    [align=left] String[] team2 = new String[] { "a", "b", "c", "d", "e", "f" }; Vector<String> vec = new Vector<String>(); for (int i = 0; i < team2.length; i++) {
    vec.add(team2[i]);
    }
    for (int j = 0; j < vec.size(); j++) {
    for (int i = j + 1; i < team2.length; i++) {
    System.out.println(vec.get(j) + team2[i]);
    }
    }[/align]
    这样的效率可能会低点吧?
      

  2.   

    恩,解决了,我放上来享下.
    把第一个固定,后面的,按照逆时针方向旋转,就解决那问题了.
    A F     A  E    A D  
    B E     F  D    E C   .......
    C D     B  C    F B马上结
      

  3.   

    CE  BD  AF  
    AE  CD  BF  
    BC  DE  (AF)然后死循环,AF由于出现过,程序下不去.完了.每周3场比赛是有一定规则的,本以为不(A,B,C,D,E,F)里不重复比赛就会没问题的,看来不太行.要不规定每周开始的比赛?第一周规定 AB,第二周规定AB,第3周规定AC,以此类推?