本帖最后由 cczcseiya423 于 2011-05-23 15:34:29 编辑

解决方案 »

  1.   


    意思是说,假如A坐在一个位置上(A属于一年级),那么A的两边至少要有一个不是一年级的同学。
      

  2.   

    一般排列组合的问题都可以用模拟进制的算法来实现,本题可以模拟三进制(0代表1年级,1代表2年级,2代表3年级),然后从000111222开始累加,达到222111000结束,从中找出符合条件的数据,打印
    for example
    import java.util.*;
    public class Test {
        public static void main(String[] args) {
            int[] a = new int[9];
            for (int i=0; i<9; i++) {
                if (i < 3) {a[i] = 0;}
                else if (i < 6) {a[i] = 1;}
                else {a[i] = 2;}
            }
            while (true) {
                String s = Arrays.toString(a); //这里为了方便转成字符串操作,性能相对有所下降
                String ss = s.replaceAll(", ", "");
                if (ss.compareTo("[222111000]") >= 0) {break;} //达到最大时退出
                if (ss.contains("000") || ss.contains("111") || ss.contains("222")) {
                    //同年级相邻排除
                } else if ((ss.replaceAll("0", "").length() != ss.length()-3) ||
                           (ss.replaceAll("1", "").length() != ss.length()-3) ||
                           (ss.replaceAll("2", "").length() != ss.length()-3) ) {
                    //各年级人数不是3人的排除
                } else if (a[0] == a[1] || a[7] == a[8]) {
                    //首尾连续2人相同的排除(如果是圆形桌,没有这个条件)
                } else {
                    System.out.println(s); //非上述的情况,即符合条件的情况打印
                }
                a[a.length-1]++; //这里模拟进制,末位+1,满3的往前进位
                for (int i=a.length-1; i>0; i--) {
                    if (a[i] == 3) {
                        a[i] = 0;
                        a[i-1]++;
                    }
                }
                if (a[0] == 3) {break;} //这个条件只是避免进位溢出
            }
        }
    }
      

  3.   

    我想弱弱的问一句    Arrays.toString(a); 是个什么方法啊?在jdk里面的哪个类里边儿啊?
      

  4.   

    jdk 1.5以后
    java.util.Arrays这个类里
    自己看下javadoc吧
    static String toString(int[] a) 
    Returns a string representation of the contents of the specified array.