python - 在这种嵌套列表情况下,比较嵌套值的正确方法是什么?
问题描述
在我们的工程师周中,我的学校发出了代码挑战。您不能使用解决大部分问题的库。这是我的问题。
[>][ ][<]
[ ][^][ ]
[ ][<][ ]
给定任意大小、任意数量的飞机、任意步骤的机场的 ASCII 艺术,解析文本文件并做三件事。
1) 给定一个步骤,找出哪架飞机会相撞,用“x”标记飞机
2) 给定一个步骤,找出哪架飞机会飞离电网而不会相互碰撞,用“o”表示。例如[ ][ ][<]
,在给定步长 3 的情况下会飞走。
3)给定一个步骤,如果飞机没有飞离网格并且没有坠毁,则在下一个着陆点替换它
我写了一些东西,可以将上面的文本文件变成一个嵌套列表,还可以获取所有水平平面的当前和未来坐标。
我目前正在开发一个名为updated_airfield 的函数,我可以在其中用“x”或“o”标记飞机或将它们移动到另一个位置。这个谜题的逻辑部分让我很生气。下面是我的 update_airfield 函数在给定步长为 2 后基于上述 ASCII 机场的输入。
# ROW 1 [>][ ][<] or ('>', 0, 0)(' ', 0, 1)('<', 0, 2)
# AFTER adding the step and formatting the output
[('>', 2), ('<', 0)]
# I took the 2nd element because its blank and I also removed the x_axis
# because we only need to go along the horizontal line.
然后我可以做的下一步是在编号的位置值之间进行数学比较。如果结果 >= 0,那么我知道他们要么都降落在同一个地方,要么他们互相穿过,所以他们坠毁了。然后我可以将'>'和'<'更改为'x',最后对每一行重复。如果我使行更长并添加更多平面,这个逻辑应该可以工作但会中断。
这就是我试图在任何给定步骤中用任何数量的飞机补偿任何大小的机场的地方。那么你如何开始解决这样的问题呢?标准 python 中是否有数据结构可以帮助我跟踪哪架飞机会相互碰撞?对于在垂直方向上下移动的飞机,我也必须做同样的事情。我正在考虑使用有序字典映射所有内容,但不知道如何进行。任何帮助是极大的赞赏。我希望我已经足够清楚了。
解决方案
您实际上不必比较数组。除非您有大量的步骤或字段,否则最简单的方法是通过播放指示来模拟每个步骤。顺便说一句,哪个符号表示向下?
Initial state
[>][ ][<]
[ ][^][ ]
[ ][<][ ]
Step +1
[ ][X][ ]
[ ][ ][ ]
[<][ ][ ]
Step +2
[ ][X][ ]
[ ][ ][ ]
[L][ ][ ]
等等。您必须小心不要在一个步骤中移动同一平面。为了避免这种情况并保持事情相对简单,您可以创建一个结构来保存飞机状态,并创建一个数组来保存位置以检查碰撞(这只是一种优化)。
我会去伪代码。
你的飞机类可以包含:
originalX;
originalY;
currentX;
currentY;
state # on the field, left, collided
stepNoLeft;
stepNoCollided;
ListcollidedWith - optional
将飞机放入列表中,该列表将用作队列。创建一个二维数组来保存当前位置(只是为了回顾你碰撞过的飞机)。如果该字段非常稀疏(数千个单元格和几架飞机,您可能会考虑使用不同的结构。可能是列表映射或多映射,在这种情况下,您将拥有的唯一数组将是飞机列表,以及他们与谁发生了碰撞。因此,该字段可以是一个多重映射(列表映射),其中键为 x/y 位置。让我们使用多重映射,因为这将更通用。
清理现场地图(用于下一步)迭代飞机列表并将飞机放在地图中的“现场”/上。第一步你不应该有坐标碰撞。如果飞机发生碰撞,它可能不应该移动或飞走。你可以跳过已经飞走的平原(它们不会改变方向,所以一旦离开田野它们是安全的。地图仍然可以追踪那些,但我们不必这样做)请注意,以下情况可能是有效的:飞机在一个文件中相互跟随:
step 0 [ ][<][<][ ]
step 1 [<][<][ ][ ]
更新当前的 X,Y 并将其放入多图中,或者如果它正在离开场,则将其标记为场外。(您可以在此时检查目标单元格是否被占用,但可以等待步骤结束)在步骤结束时迭代地图并标记具有多架飞机的单元格以进行碰撞。
冲洗并重复
例子:
For the Initial state
[>][ ][<]
[ ][^][ ]
[ ][<][ ]
它看起来像这样:
tuple: (x,y,direction,id)
step 0: airplanes( (0,0,'>', 'A') , (0,2,'<', 'B') , (1,1,'^', 'C') ,(2,1,'<', 'D')
step 1: airplanes( (0,1,'>', 'A') , (0,1,'<', 'B') , (0,1,'^', 'C') ,(2,0,'<', 'D')
map step1:
key: 0-1 : A,B,C – collided at step1
key:2-0: D
第2步:飞机((0,1,'>','A'),(0,1,'<','B'),(0,1,'^','C'),(2, -1,'<','D')
airplanse A,B,C don't move (let's assume that once there was a collision they don't move)
airplane D – has left the field
map step1:
key: 0-1 : A,B,C – collided at step1
D is not in the map
由于 python 有很好的内置列表和地图,你不需要任何库。
推荐阅读
- switch-statement - 在 SQL 开发人员的 Where 子句中使用 Case 语句
- java - 如何在 GraphQL SPQR 中将子类视为其父类
- java - 如何从同一个类java中的另一个方法访问多个对象?
- javascript - React UseState 未响应 axios GET 请求而更新
- java - 如何在 Map 中收集我的 java 对象
> 格式? - three.js - 有没有办法在禁用 VR 模式的情况下将 Three.js 效果器实现到 Aframe 中?
- python - 如何查看文本小部件当前在 Tkinter 中滚动了多远?
- azure - Azure Synapse Workspace 无服务器池的 Azure Purview 扫描未返回架构
- android - 我可以在捆绑事件中使用 AdapterView
- jmeter - 如何在 JMeter 中为每个请求添加唯一性