汽车票座位分配算法

项目上需要实现机场巴士小程序订票的功能,自然涉及到汽车票座位号分配的问题。自己写了一个,和大家一起分享,如有问题希望大家指出~

问题描述
  实现一个汽车票购票系统的简单座位分配算法,来处理一班车次的座位分配。
  假设一辆大巴车有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);
    }
}

运行结果如下:
测试结果

希望能对大家有所帮助,有问题也请留言指出~

展开阅读全文

没有更多推荐了,返回首页