那也好办,再加个判断就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; } }
看你们写的好复杂...直接用集合的方法就可以了吧....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楼“// 分配之后”打印时下标忘记改了,修正并调整了一下: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(); } }
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++;
}
}
}
// 随机出来的座位号
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));
}
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));
}
// 随机出来的座位号
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));
}
需要哪个就用那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;
}
}
}
个
这里改了下 只生成 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);
}
}
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)+" ");
}
呵呵
重写了下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); //递归交给下一位
}
}
那也好办,再加个判断就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;
}
}
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);
}
}
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();
}
}