算法实例练习——性格(内向外向人选座位)公交车问题(Python)

问题描述:

        1. 一辆公交有 N 排座椅(有次序),一排座椅有两个座位,那一辆公交就有 2N 个座位。

        2. 有两类人上车,且坐满座位,所以会有 N 个内向的人,N 个外向的人:    

                    0->内向的人-->上车后找没人的,且座椅最小的位置坐下;

                    1->外向的人-->上车后找有人的,且座椅最大的位置坐下;

        3. 输出结果,依据上车次序,给出每个人的座椅排号。

   

    举例:

  •         座椅数量 N=3  且大小为 [10, 5, 20] ,座位数量为 2N=6
  •         上车顺序为 [0,0,1,1,0,1]
  •         输出结果为每个人的座椅排号:[2,1,1,2,3,3]

程序脚本:

# 座椅类
class BusSeat:
    def __init__(self, width, isperson, seatindex):
        self.width = width
        self.isperson = isperson
        self.seatindex = seatindex

# 核心算法
def GongjiaoSeats(bs,str):
    seats = []
    # 给bs排序->升序
    # 借助选择排序,完成初始座位的升序排序
    for i in range(len(bs)):
        minindex = i
        for j in range(i+1,len(bs)):
            if bs[j].width < bs[minindex].width:
                minindex = j
        bs[i],bs[minindex]=bs[minindex],bs[i]    

    print('=='*20)
    for i in bs:
         print(i.width,i.isperson,i.seatindex)

    print('@'*50)

    # 找座位
    for i in range(len(str)):
        if str[i]==0: #内向的人,选择无人,且宽度小的座位
            for j in range(len(bs)):          # 正向索引
                if bs[j].isperson==0:         # 当前排座椅是否已经有人: 0->没人,1->一个人,2->两个人
                    seats.append(bs[j].seatindex)
                    bs[j].isperson=1
                    bs[j+1].isperson=1
                    break
            pass
        if str[i]==1: #外向的人,选择有人,且宽度大的座位
            for j in range(len(bs)-1,-1,-1):  # 反向索引
                if bs[j].isperson==1:         # 当前排座椅是否已经有人: 0->没人,1->一个人,2->两个人
                    seats.append(bs[j].seatindex)
                    bs[j].isperson=2
                    bs[j-1].isperson=2
                    break
            pass

    print('指定的座椅顺序:', seats)

# 程序主体:
bs = []
bslist = [10, 5, 20,2,50]
str = [0,0,1,1,0,1,0,0,1,1]

# 初始化座椅编号:
for i in range(len(bslist)):
    bs.append(BusSeat(bslist[i],0,i+1))
    bs.append(BusSeat(bslist[i],0,i+1))

print('*'*50)

for i in bs:
    print(i.width,i.isperson,i.seatindex)

print('*'*50)

GongjiaoSeats(bs,str)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值