随机分配座位,共50个学生,使学号相邻的同学座位(号)不能相邻。写出程序
random取随机数:

解决方案 »

  1.   

    下面是我的代码,应该能满足楼主的需求:import java.util.*;public class RandomTest {
    public static void main(String[] args) {
    int[] students = new int[50];

    //给每个同学分配一个学号
    for(int i=0; i<students.length; i++) {
    students[i] = i + 1;
    }

    int[] seats = new int[50];

    //给每个座位一个编号
    for(int i=0; i<seats.length; i++) {
    seats[i] = i + 1;
    }

    //保存学生和座位的对应关系
    Map<Integer,Integer> stu_seat = new HashMap<Integer,Integer>();
    //为每个同学分配座位,学号相邻的座位号不相邻
    int previous = -2;//保存上次随机出来的座位号
    int current;//保存这次随机出的座位号
    Random rd = new Random();
    for(int i=0; i<students.length; i++) {
    current = rd.nextInt(50);
    while(Math.abs(previous - current) == 1) {//说明学号相邻的座位号也相邻,继续随机座位
    current = rd.nextInt(50);
    }
    stu_seat.put(students[i], seats[current]);
    previous = current;
    }

    //打印出每位同学对应的座位号
    int i = 0;
    while(!stu_seat.isEmpty() && i < students.length) {
    System.out.println(students[i] + "->" + stu_seat.get(students[i]));
    i++;
    }
    }
    }
      

  2.   

    Map map = new HashMap();
            // 随机出来的座位号
            int studentNum = 0;
            // 保存上次随机出来的座位号
            int studentPreNum = 0;
            Random rd = new Random();
            // 所有以前随机出来的座位号
            String Num = ",";        for (int i = 1; i < 51; i++) {
                studentNum = rd.nextInt(50);
                // 说明学号相邻的座位号也相邻或者以前曾经出现过,继续随机座位
                while (Math.abs(studentPreNum - studentNum) == 1 && Num.indexOf(studentNum) != 0) {
                    studentNum = rd.nextInt(50);
                }
                Num += studentNum + ",";
                map.put(i, studentNum);
                studentPreNum = studentNum;
            }
            for (int i = 1; i <= map.size(); i++) {
                System.out.println("学生" + i + "->" + map.get(i));
            }
      

  3.   

    刚才发的有点错误,重发一个
    Map map = new HashMap();
            // 随机出来的座位号
            int studentNum = 0;
            // 保存上次随机出来的座位号
            int studentPreNum = 0;
            Random rd = new Random();
            // 所有以前随机出来的座位号
            String Num = ",";        for (int i = 1; i < 51; i++) {
                studentNum = rd.nextInt(50);
                // 说明学号相邻的座位号也相邻或者以前曾经出现过,继续随机座位
                while (Math.abs(studentPreNum - studentNum) == 1 && Num.indexOf(studentNum) != -1) {
                    studentNum = rd.nextInt(50);
                }
                Num += studentNum + ",";
                map.put(i, studentNum);
                studentPreNum = studentNum;
            }
            for (int i = 1; i <= map.size(); i++) {
                System.out.println("学生" + i + "->" + map.get(i));
            }
      

  4.   

    不好意思,刚才的那个不够严谨.现在发的程序,有个问题,就是运行的时间比较长。希望大家能够帮忙改善Map map = new HashMap();
            // 随机出来的座位号
            int studentNum = 0;
            // 保存上次随机出来的座位号
            int studentPreNum = 0;
            Random rd = new Random();
            // 所有以前随机出来的座位号
            String Num = ",";        for (int i = 1; i < 51; i++) {
                studentNum = rd.nextInt(50);
                // 说明学号相邻的座位号也相邻或者以前曾经出现过,继续随机座位
                while (Math.abs(studentPreNum - studentNum) == 1
                        || Num.indexOf("," + studentNum + ",") != -1 || studentNum == 0) {
                    studentNum = rd.nextInt(50);
                    System.out.println(studentNum);
                }
                Num += studentNum + ",";
                map.put(i, studentNum);
                studentPreNum = studentNum;
            }
            for (int i = 1; i <= map.size(); i++) {
                System.out.println("学生" + i + "->" + map.get(i));
            }
      

  5.   

    下面这个可以把所有的组合都打出来
    需要哪个就用那public class Test {

    public static void main(String[] args) {
    int[] nums = new int[50];
    for(int i = 0; i < nums.length; i++){
    nums[i] = i + 1;
    }
    test(nums);
    }

    public static void test(int[] nums)
        {
            testMethod(nums, 0);
        }    public static void testMethod(int[] nums, int index)
        {
            if (index == nums.length - 1)
            {
                for(int i = 0; i < nums.length; i++){
         System.out.print(nums[i] + " ");
         }
                System.out.println();
                return;
            }
            int temp = 0;
            for (int i = index; i < nums.length; i++)
            {
                if ( index > 0 && (nums[i] - nums[index - 1] == 1 || nums[index - 1] - nums[i] == 1))
                {
                    continue;
                }
                temp = nums[index];
                nums[index] = nums[i];
                nums[i] = temp;
                testMethod(nums, index + 1);
                temp = nums[index];
                nums[index] = nums[i];
                nums[i] = temp;
            }
        }
    }
      

  6.   

    我5楼给的求全解太多了
    这里改了下 只生成 1 个了import java.util.Random;public class Test {

    private static Random random = new Random();

    public static void main(String[] args) {
    int[] nums = new int[50];
    for(int i = 0; i < nums.length; i++){
    nums[i] = i + 1;
    }
    test(nums);
    }

    public static void test(int[] nums)
        {
            testMethod(nums, 0);
        }    public static void testMethod(int[] nums, int index)
        {
            if (index == nums.length - 1)
            {
                for(int i = 0; i < nums.length; i++){
         System.out.print(nums[i] + " ");
         }
                System.out.println();
                return;
            }
            int temp = (random.nextInt(nums.length) + index) % nums.length;
            while(temp == index || (index > 0 &&  (nums[temp] - nums[index - 1] == 1  ||  nums[index - 1] - nums[temp] == 1)) ){
             temp = (random.nextInt(nums.length) + index) % nums.length;
            }
            nums[index] ^= nums[temp];
            nums[temp] ^= nums[index];
            nums[index] ^= nums[temp];
            testMethod(nums, index + 1);
        }
    }
      

  7.   


    public static void main(String[] args) {
    int len=50;
            List<Integer> list=new ArrayList<Integer>(len);
            
            //给每个同学分配一个学号
            for(int i=0; i<len; i++) {
             list.add(i+1);
            }    
            
            Collections.shuffle(list);
            
            for(int i=0;i<len;i++) //座位分配
             System.out.print(list.get(i)+" ");
    }
      

  8.   

    在7楼给的有点小BUG 
    呵呵 
    重写了下package com.keeya.csdn.test;import java.util.Random;public class Test {

    private static Random random = new Random();

    public static void main(String[] args) {
    int[] nums = new int[50];
    for(int i = 0; i < nums.length; i++){
    nums[i] = i + 1;
    }

    //测试 生成 30 组
    for(int i = 0; i < 30; i++){
    test(nums);
    }
    }

    public static void test(int[] nums)
        {
            testMethod(nums, 0);
        } //将50个学生按顺序排好后,从头往后在符合要求的情况下随机的调换2个学生的位置
        public static void testMethod(int[] nums, int index)
        {
            if (index == nums.length - 1)
            {
             //如果最后两个是相邻的,返回上一个重新调换
             if(nums[nums.length - 1] - nums[nums.length - 2] == 1 ||
             nums[nums.length - 2] - nums[nums.length - 1] == 1){
             testMethod(nums, index - 1);
             }
                for(int i = 0; i < nums.length; i++){
         System.out.print(nums[i] + " ");
         }
                System.out.println();
                return;
            }
            
            
            int temp = (random.nextInt(nums.length) + index) % nums.length;
    //      生成某一个学号的学生与当前的对换,并确保被换来的学生不会和当前位置附近相邻
    //      并且换过去的学号也不能和被换者附近的相邻
            while(
             //自己不和自己调换
             temp == index 
             //当前非第一个时候,判断下被调过了的学号是否会与前一位相邻,后边的因为还会变更,所以不用考虑
             || (index > 0 &&  (nums[temp] - nums[index - 1] == 1  ||  nums[index - 1] - nums[temp] == 1)) 
             //被调者非第一位时候,判断下当前学号是否会与之前一位相邻
             || (temp > 0 && (nums[temp - 1] - nums[index] == 1 || nums[index] - nums[temp - 1] == 1))
             //被调者非最后一位时候,判断下当前学号是否会与之后一位相邻
             || (temp < nums.length - 1 && (nums[temp + 1] - nums[index] == 1 || nums[index] - nums[temp + 1] == 1))
            
            ){
             temp = (random.nextInt(nums.length) + index) % nums.length;
            }
            nums[index] ^= nums[temp];
            nums[temp] ^= nums[index];
            nums[index] ^= nums[temp];
            testMethod(nums, index + 1); //递归交给下一位
        }
    }
      

  9.   


    那也好办,再加个判断就OK!import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;public class RandomTest { public static void main(String[] args) {
    int len = 60;
    List<Integer> list = new ArrayList<Integer>(len); // 给每个同学分配一个学号
    for (int i = 0; i < len; i++) {
    list.add(i + 1);
    }
    for (int i = 0; i < len; i++)
    // 分配之前
    System.out.print(list.get(i) + " ");
    System.out.println(); do {// 先打乱再检查是否有相邻,直到没有才结束循环
    Collections.shuffle(list);
    } while (hasBorderUpon(list)); for (int i = 1; i < len - 1; i++) { // 分配之后
    System.out.print(list.get(i) + " ");
    }
    } // 检查是否有相邻情况
    public static boolean hasBorderUpon(List<Integer> list) {
    int len = list.size();
    for (int i = 1; i < len - 1; i++) {
    if (Math.abs(list.get(i) - list.get(i - 1)) == 1
    || Math.abs(list.get(i) - list.get(i + 1)) == 1) {
    return true;
    }
    }
    return false;
    }
    }
      

  10.   

    看你们写的好复杂...直接用集合的方法就可以了吧....import java.util.ArrayList;
    import java.util.Collections;/*
     * 50个学生学号1-50,随即排,要求学号不能相邻,用程序实现打印出一种排列
     */
    public class StudentSeat {
    public static void main(String[] args) {
    int m = 50;
    //生成一个50个学生的集合
    ArrayList students = new ArrayList();
    for (int i = 0; i < m; i++) {
    students.add(i + 1);
    }
    while(true){
    //对集合随即排列
    Collections.shuffle(students);
    //定义集合是否合法的标签
    boolean flag = true;
    //遍历集合的每一个数,和后面一个比较,如果相邻,则判断集合不合法
    for(int i =0;i<students.size()-1;i++){
    int thisId = (Integer)students.get(i);
    int nextId = (Integer)students.get(i+1);
    if(Math.abs(thisId-nextId)==1){
    flag = false;
    }
    }
    //如果合法,跳出长真循环
    if(flag){
    break;
    }
    }
    //打印合法的集合
    System.out.println(students);
    }
    }
      

  11.   

    不好意思,在11楼“// 分配之后”打印时下标忘记改了,修正并调整了一下:import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;public class RandomTest { private List<Integer> list; public RandomTest(int size) {
    init(size);
    } // 顺序初始化
    private void init(int size) {
    list = new ArrayList<Integer>(size);
    for (int i = 0; i < size; i++) {
    list.add(i + 1);
    }
    } // 打印List
    public void printList() {
    int size = list.size();
    for (int i = 0; i < size; i++) {
    System.out.print(list.get(i) + " ");
    }
    System.out.println(); // 换行
    } // 检查是否有相邻情况
    private boolean hasBorderUpon(List<Integer> list) {
    int len = list.size();
    for (int i = 1; i < len - 1; i++) {
    if (Math.abs(list.get(i) - list.get(i - 1)) == 1
    || Math.abs(list.get(i) - list.get(i + 1)) == 1) {
    return true; // 当前值和上一个值或和下一个值出现相邻情况时
    }
    } return false;
    } public List<Integer> getShuffleList() {
    do {// 先打乱再检查是否有相邻,直到没有才结束循环
    Collections.shuffle(list);
    } while (hasBorderUpon(list));
    return list;
    } public static void main(String[] args) {
    RandomTest rt = new RandomTest(50);
    rt.printList();
    rt.getShuffleList();
    rt.printList();
    }
    }