第1个回答 2019-04-17
# Python3.6
# 导入random模块
import random
# 定义一个人椅的类
class ManAndBench:
def __init__(self, n_bench):
self.bench_num = n_bench
# 依次已经被占用的座位号
self.break_point = []
def print_bench(self):
# 定义全0数组作为长椅
pt_str = [0 for _ in range(self.bench_num)]
# 按照占用的作为号,重写长椅数字
for i, item in enumerate(self.break_point):
# 长椅的第[作为号]赋值为第i+1个人
pt_str[item] = i+1
brk_num = len(self.break_point)
if brk_num == 0:
print("长椅为空:", pt_str)
else:
print("{:2d}号男人: {}".format(brk_num, pt_str))
def next_man(self):
# 如果是第一个人,使用随机占座
if len(self.break_point) == 0:
fst = random.randint(0, self.bench_num - 1)
self.break_point.append(fst)
else:
brk_num = len(self.break_point)
# 产生已经被占座的个数+1的全零数组,用于空的位置长度计数
block_size = [0 for _ in range(brk_num + 1)]
# 统计每个空位置的长度
tmp = 0
for i in range(self.bench_num):
# 如果第i个作为没有被占用,则第tmp个数组加1
if i not in self.break_point:
block_size[tmp] += 1
# 否则,tmp加1,统计下一个间隔段的长度
else:
tmp += 1
# 找出最大长度,计算最大长度块的序号
max_block = max(block_size)
max_index = block_size.index(max_block)
# 计算最大长度块在整个长椅中的分割点
start = 0
for i in range(max_index):
start += block_size[i]+1
self.break_point.append(start + max_block // 2)
c = int(input("请输入椅子的数量:"))
while True:
m = int(input("请输入人的数量:"))
if m <= c:
break
else:
print("人数量大于椅子数量,请重新输入!")
# 引用定义的类
mab = ManAndBench(c)
# 打印长椅
mab.print_bench()
# 每次坐一个人,打印一次
for _ in range(m):
mab.next_man()
mab.print_bench()本回答被提问者采纳