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
相关产品推荐
相关产品推荐

