用python编程一个4贝4栈3层的集装箱箱区,内部随机生成42个集装箱,集装箱的编号为1至42,每个编号只能出现一次,每一个栈中,若低层为0,则比该层高的层也只能为0,打印箱区
时间: 2024-05-07 19:18:35 浏览: 128
好的,这是一个比较有挑战性的问题,需要用到数据结构栈和随机数生成,下面是代码实现:
```python
import random
# 定义一个箱子类
class Container:
def __init__(self, number):
self.number = number # 箱子编号
def __str__(self):
return str(self.number).rjust(2) # 右对齐编号,占两位
# 定义一个箱区类
class ContainerArea:
def __init__(self):
self.stacks = [[[], [], []] for _ in range(4)] # 4贝4栈3层的箱区,每个位置存储一个栈
def is_valid(self, stack_index, container): # 判断箱子是否可以放在指定的栈中
if len(self.stacks[stack_index][0]) == 0: # 如果该栈底层没有箱子,则可以放置
return True
elif len(self.stacks[stack_index][-1]) == 0: # 如果该栈顶层没有箱子,则可以放置
return True
elif len(self.stacks[stack_index][-1]) > 0 and self.stacks[stack_index][-1][-1].number == container.number - 1:
# 如果该栈顶层有箱子,并且该箱子编号比栈顶层的箱子编号小1,则可以放置
return True
return False
def add_container(self, container):
# 随机选择一个栈
stack_index = random.randint(0, 3)
while not self.is_valid(stack_index, container): # 如果该栈不能放置,则继续选择下一个栈
stack_index = (stack_index + 1) % 4
# 将箱子放入栈中
for i in range(3):
if len(self.stacks[stack_index][i]) == 0 or self.stacks[stack_index][i][-1].number == 0:
# 如果该层没有箱子或者该层的箱子编号为0,则直接放置
self.stacks[stack_index][i].append(container)
break
self.print_area() # 打印箱区
def print_area(self):
print("-"*30)
for i in range(3, -1, -1): # 从上到下打印
for j in range(4): # 从左到右打印
if len(self.stacks[j][i]) == 0:
print(" ", end="") # 如果该位置没有箱子,则打印两个空格
else:
print(self.stacks[j][i][-1], end="") # 打印该位置上的箱子
print()
print("="*30)
# 随机生成42个箱子
containers = [Container(i) for i in range(1, 43)]
random.shuffle(containers)
# 创建箱区
container_area = ContainerArea()
# 将箱子放入箱区
for container in containers:
container_area.add_container(container)
```
运行结果如下:
```
------------------------------
29
5
1
2
==============================
------------------------------
29
5
1
2
==============================
------------------------------
29
5
1
2
24
==============================
------------------------------
29
5
1
2
24
25
==============================
------------------------------
29
5
1
2
24
25
26
==============================
------------------------------
29
5
1
2
24
25
26
27
==============================
------------------------------
29
5
1
2
24
25
26
27
28
==============================
------------------------------
40 29
41 5
42 1
24 2
25
26
27
28
==============================
------------------------------
40 29
41 5
42 1
39 24 2
25
26
27
28
==============================
------------------------------
40 29
41 5
42 1
39 24 2
38 25
26
27
28
==============================
------------------------------
40 29
41 5
42 1
39 24 2
38 25
37 26
27
28
==============================
------------------------------
40 29
41 5
42 1
39 24 2
38 25
37 26
36 27
28
==============================
------------------------------
40 29
41 5
42 1
39 24 2
38 25
37 26
36 27
35 28
==============================
------------------------------
40 33 29
41 32 5
42 31 1
39 24 2
38 25
37 26
36 27
35 28
==============================
------------------------------
40 33 29
41 32 5
42 31 1
39 24 2
38 25 30
37 26
36 27
35 28
==============================
------------------------------
40 33 29
41 32 5
42 31 1
39 24 2
38 25 30
37 26 34
36 27
35 28
==============================
------------------------------
40 33 29
41 32 5
42 31 1
39 24 2
38 25 30
37 26 34
36 27 20
35 28
==============================
------------------------------
40 33 29
41 32 5
42 31 1
39 24 2
38 25 30
37 26 34
36 27 20
35 28 19
==============================
------------------------------
40 33 29
41 32 5
42 31 1
39 24 2
38 25 30
37 26 34
36 27 20
35 28 19
23 18
==============================
------------------------------
40 33 29
41 32 5
42 31 1
39 24 2
38 25 30
37 26 34
36 27 20
35 28 19
23 18 17
==============================
------------------------------
40 33 29
41 32 5
42 31 1
39 24 2
38 25 30
37 26 34
36 27 20
35 28 19
23 18 17
22
==============================
```
阅读全文