给n个学生分配n个座位,要求学号相邻的学生座位不相邻!

本文介绍如何使用Java编程解决一个问题:给定n个学生和n个座位,确保学号相邻的学生不会坐在相邻的座位上。通过随机算法进行座位分配,给出两种不同的测试用例展示实现效果。
摘要由CSDN通过智能技术生成


随机分配座位,共n个学生,使学号相邻的同学座位不能相邻。座位肯定也是n个,如果座位多余学生个数,这种情况
没有考虑。!也是一种问题。。。


我的思路是,先定义50个拥有学号的学生并且该学生对象中保存他的学号(-1:学生不存在),座位号(-1:尚未分
配),以及他前一个与后一个同学的信息,同时定义50个座位,然后将其存放到两个集合中,一个存放学生,一个存
放座位,打印分配前的信息。在学生集合中随机选择一个学生进行分配座位,座位编号取自座位集合,被分配的座位
要从座位集合中移除,已分配座位的学生也要从学生集合中移除,对于分配座位时,要分情况讨论,学号最前与最后
的同学只需要考虑一个同学的情况,而学号位于中间的学生分配座位要考虑他学号前后学生的座位编号(如果已经分
配了座位),看是否相邻,相邻则另外重新随机选择座位编号,直到不相邻,直到最后学生,座位都分配完。打印分
配后的信息。

一共两个类,一个学生类,一个主程序,代码如下:(运行截图附在最后)


package study;

public class Student {
   
private int stuId;//学生的学号(用1,2,3.。。。来模拟)
private int seatId;//学生的座位号(用1,2,3.。。。来模拟)
private Student preStudent;//与当前学生学号相邻的前一个学生(当前学号:2,前一个学号:1)
private Student nextStudent;//与当前学生学号相邻的后一个学生(当前学号:2,后一个学号:3)
public Student() {
   
	super();
}
@Override
public String toString() {
   
	return "Student [stuId=" + stuId + ", seatId=" + seatId + ", preStudent=" + preStudent + ", nextStudent="
			+ nextStudent + "]";
}
public int getStuId() {
   
	return stuId;
}
public void setStuId(int stuId) {
   
	this.stuId = stuId;
}
public int getSeatId() {
   
	return seatId;
}
public void setSeatId(int seatId) {
   
	this.seatId = seatId;
}
public Student getPreStudent() {
   
	return preStudent;
}
public void setPreStudent(Student preStudent) {
   
	this.preStudent = preStudent;
}
public Student getNextStudent() {
   
	return nextStudent;
}
public void setNextStudent(Student nextStudent) {
   
	this.nextStudent = nextStudent;
}
}



package study;

import java.util.ArrayList;
import java.util.Random;

public class DistributeSeat {
   
	// 定义n个学生
	public static ArrayList<Student> defineStu(int n) {
   
		ArrayList<Student> arrayList = new ArrayList<Student>();// 存放n个学号相邻的学生的集合
		// 先定义n个学号相邻的学生
		for (int i = 1; i <= n; i++) {
   
			Student student = new St
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值