项目上需要实现机场巴士小程序订票的功能,自然涉及到汽车票座位号分配的问题。自己写了一个,和大家一起分享,如有问题希望大家指出~
问题描述
实现一个汽车票购票系统的简单座位分配算法,来处理一班车次的座位分配。
假设一辆大巴车有50个座位。为方便起见,我们用1到50来给所有的座位编号。
购票时,一个人可能购一张或多张票。如果这几张票可以安排在相邻的座位,则应该安排在编号最小的相邻座位。否则应该安排在编号最小的几个空座位中(不考虑是否相邻)。
退票时,对应座位需空出来,下次单票购买需优先分配编号最小的空座位。
假设初始时车票全部未被购买,现在给了一些购票和退票指令,请你处理这些指令。
话不多说,直接上代码。默认输入都是正确的指令,退票也退的都是已售出的票。(自己在系统业务逻辑里控制)
import java.util.Scanner;
public class SeatTest {
private static String seatSign = "00000000000000000000000000000000000000000000000000";
public static void main(String[] args) {
System.out.println("当前座位情况:");
System.out.println(seatSign);
for (int i = 0; i < 100; i++) {
Scanner input = new Scanner(System.in);
System.out.println("请输入操作代码。1:购票,2:退票");
int flag = input.nextInt();
if (flag == 1) {
System.out.println("请输入买票张数:");
int orderSize = input.nextInt();
setSeat(orderSize);
System.out.println("购票 " + orderSize + " 张。当前座位情况:");
System.out.println(seatSign + "");
} else if (flag == 2) {
System.out.println("请输入退票座位号:");
int seatNo = input.nextInt();
char[] seatArray = seatSign.toCharArray();
seatArray[seatNo - 1] = '0';
seatSign = String.valueOf(seatArray);
System.out.println("退票1张。当前座位情况:");
System.out.println(seatSign + "");
}
}
}
private static void setSeat(int orderSize) {
char[] seatArray = seatSign.toCharArray();
// 连续分配Flag
boolean continuousFlag = true;
for (int i = 0; i < seatArray.length; i++) {
continuousFlag = true;
// 当前座位有人
if (seatArray[i] == '1') {
// 遍历一次没能分配连续座位
if (i == seatArray.length - 1) {
continuousFlag = false;
}
continue;
}
// 当前座位没人,检查接下来的[订单数-1]个座位有没有人
for (int j = 1; j < orderSize; j++) {
// 检查到最后一位都没有连续座位
if (i + j >= seatArray.length) {
continuousFlag = false;
break;
}
if (seatArray[i + j] == '1') {
i = i + j;
continuousFlag = false;
break;
}
}
if (continuousFlag) {
// 分配连续车票
for (int k = 0; k < orderSize; k++) {
seatArray[i + k] = '1';
}
break;
}
}
if (!continuousFlag) {
// 分配不连续车票
int seatFlag = 0;
for (int i = 0; i < orderSize; i++) {
// boolean currentSeatSuccess = false;
for (; seatFlag < seatArray.length; seatFlag++) {
if (seatArray[seatFlag] == '0') {
// 座位占位符数组更新
seatArray[seatFlag] = '1';
break;
}
}
}
}
seatSign = String.valueOf(seatArray);
}
}
运行结果如下:
希望能对大家有所帮助,有问题也请留言指出~