在我们的工程师周内,我的学校发出了代码挑战。不允许您使用可解决大部分问题的库。这是我的问题。
[>][ ][<]
[ ][^][ ]
[ ][<][ ]
在任何步骤中,以任意大小,具有任意数量的飞机的飞机场的ASCII艺术,解析文本文件并做三件事。
1)给定一个步骤,找出哪架飞机会撞到对方,用'x'标记飞机。
2)给定一个步骤,找出哪架飞机会从网格上飞出而不会撞到对方,请用'o'表示。例如,[ ][ ][<]
会以给定的步长3飞走。
3)采取步骤,如果飞机没有从网格上飞过并且没有坠毁,请在下一个着陆点更换飞机
我写了一些东西,可以将上面的文本文件变成一个嵌套列表,还可以获取其在水平方向上所有平面的当前和未来坐标。
我目前正在使用一个名为update_airfield的函数,在该函数中,我可以用'x'或'o'标记飞机或将它们移动到另一个位置。这个难题的逻辑部分正在杀死我。在给定步长2之后,以下是基于上述ASCII机场的update_airfield函数的输入。
# 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中是否有数据结构可以帮助我跟踪哪架飞机会相互撞毁?对于在垂直方向上上下移动的飞机,我也必须执行相同的操作。我当时想用有序字典映射所有内容,但不确定如何进行。任何帮助是极大的赞赏。我希望我能使自己足够清楚。
答案 0 :(得分:1)
您实际上不必比较数组。除非您具有大量步骤或字段,否则最简单的方法是通过播放方向来模拟每个步骤。顺便说一句,哪个符号代表向下?
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具有不错的内置列表和地图,因此您不需要任何库。