You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#巴士票务预订系统区间座位冲突处理算法问题咨询

巴士座位区间冲突判断的实现方案

这个问题本质是区间重叠判断的场景化应用,核心是区分「相邻站点的座位交接」和「行驶段的重叠占用」。我来给你拆解具体的实现思路和代码:

第一步:站点数字化编码

首先得把字符串形式的站点(A/B/C/D)转换成可比较的数值,这样区间的重叠判断就变成简单的数值运算。推荐用枚举或者字典来实现:

// 用枚举定义站点,数值按路线顺序递增
public enum BusStation
{
    A = 1,
    B = 2,
    C = 3,
    D = 4
}

// 如果后续站点可能动态增加,也可以用字典映射
// var stationOrder = new Dictionary<string, int> { {"A",1}, {"B",2}, {"C",3}, {"D",4} };

第二步:定义预订数据模型

先抽象出座位预订的基本信息,方便后续逻辑处理:

public class SeatBooking
{
    public int SeatNumber { get; set; }
    public BusStation StartStation { get; set; }
    public BusStation EndStation { get; set; }
}

第三步:核心冲突判断逻辑

关键规则是:两个区间只要存在「行驶段重叠」就冲突,相邻站点的交接(比如A→B和B→C)不算冲突。对应的判断逻辑可以写成这个方法:

/// <summary>
/// 判断新预订和已有预订是否存在座位冲突
/// </summary>
/// <param name="existing">已有的座位预订</param>
/// <param name="newBooking">新提交的预订请求</param>
/// <returns>true=冲突,false=可预订</returns>
public bool HasSeatConflict(SeatBooking existing, SeatBooking newBooking)
{
    // 不是同一个座位,直接跳过
    if (existing.SeatNumber != newBooking.SeatNumber)
        return false;

    // 把站点转换成数值,方便比较
    int existingStart = (int)existing.StartStation;
    int existingEnd = (int)existing.EndStation;
    int newStart = (int)newBooking.StartStation;
    int newEnd = (int)newBooking.EndStation;

    // 冲突条件:新区间的起点 < 已有区间的终点,且新区间的终点 > 已有区间的起点
    // 这个逻辑会排除掉相邻站点的情况(比如新终点=已有起点,或者新起点=已有终点)
    return newStart < existingEnd && newEnd > existingStart;
}

验证你的场景:

  • 已有预订:B(2)→C(3)
    • 新预订A→D:newStart=1 <3,newEnd=4>2 → 返回true(冲突,禁止预订)
    • 新预订B→D:newStart=2 <3,newEnd=4>2 → 返回true(冲突,禁止预订)
    • 新预订A→B:newEnd=2 不大于 existingStart=2 → 返回false(无冲突,允许预订)
    • 新预订C→D:newStart=3 不小于 existingEnd=3 → 返回false(无冲突,允许预订)

完全符合你的需求!

第四步:封装全局预订校验方法

如果一个座位有多个已预订记录,需要遍历所有记录做冲突判断:

/// <summary>
/// 校验某个座位是否可以接受新预订
/// </summary>
/// <param name="seatNumber">座位号</param>
/// <param name="start">起点站</param>
/// <param name="end">终点站</param>
/// <param name="allBookings">系统中所有已有的预订记录</param>
/// <returns>true=可预订,false=不可预订</returns>
public bool CanBookSeat(int seatNumber, BusStation start, BusStation end, List<SeatBooking> allBookings)
{
    // 前置校验:起点不能大于等于终点
    if ((int)start >= (int)end)
        throw new ArgumentException("起点站不能晚于或等于终点站");

    var newBooking = new SeatBooking
    {
        SeatNumber = seatNumber,
        StartStation = start,
        EndStation = end
    };

    // 遍历该座位的所有已有预订,只要有一个冲突就返回不可预订
    foreach (var existing in allBookings.Where(b => b.SeatNumber == seatNumber))
    {
        if (HasSeatConflict(existing, newBooking))
            return false;
    }

    return true;
}

额外注意事项

  • 站点的数值编码必须严格按照路线顺序递增,否则比较逻辑会失效;
  • 可以在前端就做起点终点的合法性校验(比如不能选A→A,或者D→B),减少后端的无效请求;
  • 如果后续需要支持多路线,只要给每个路线单独维护站点编码即可,核心冲突判断逻辑不需要改动。

内容的提问来源于stack exchange,提问作者Selva

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:46:45