解题思路:
1. 一个队列(待入站),一个栈(模拟火车站),一个列表(存放结果)
2. 深度优先搜索,遍历所有情况(两个方向,一个出站,一个入站)
结束递归条件(全部出站),保存结果
3. 对结果进行排序(普通冒泡排序会超时,可以用快排,或者在深搜时用插入排序)
4. 一个小细节,因为n<10, 可以把火车出站序列转为一个整数(用于排序比较)
# -*- coding: utf-8 -*-
# 开发者 : QSheng
# 代码文件 : HJ77 火车进站.py
# 创建时间 : 2021/7/28 9:07
class Solution:
def __init__(self):
self.rnt_ = list() # 存放结果
self.rnt_key_ = list() # 存放结果的key
def _add_rnt(self, tmp, tmp_key):
""" 添加结果 (插排) """
idx = -1
for i in range(len(self.rnt_)-1, -1, -1):
if tmp_key > self.rnt_key_[i]:
idx = i
break
if idx == -1:
self.rnt_ = [tmp] + self.rnt_
self.rnt_key_ = [tmp_key] + self.rnt_key_
else:
self.rnt_ = self.rnt_[:idx+1] + [tmp] + self.rnt_[idx+1:]
self.rnt_key_ = self.rnt_key_[:idx+1] + [tmp_key] + self.rnt_key_[idx+1:]
def _dfs(self, n, station_stack, in_queue, out_stack):
"""
深度优先搜索
:param n: 火车数量
:param station_stack: 车站
:param in_queue: 火车入站序列
:param out_stack: 火车出站序列
:return:
"""
# 两个方向,一个入站,一个出站
# 出站
if len(station_stack) > 0:
station_stack_cp = station_stack.copy()
out_stack_cp = out_stack.copy()
train_tmp = station_stack_cp.pop() # 出站
out_stack_cp.append(train_tmp) # 记录出站序列
if len(out_stack_cp) == n: # 全部已经出站
# self.rnt_.append(out_stack_cp)
# self.rnt_key_.append(int("".join(out_stack_cp)))
# 直接插入排序
self._add_rnt(out_stack_cp, int("".join(out_stack_cp)) )
return
self._dfs(n, station_stack_cp, in_queue, out_stack_cp)
# 入站
if len(in_queue) > 0:
station_stack_cp = station_stack.copy()
in_queue_cp = in_queue.copy()
train_tmp = in_queue_cp.pop(0) # 从入站队列中取出火车
station_stack_cp.append(train_tmp) # 入站
self._dfs(n, station_stack_cp, in_queue_cp, out_stack)
return
def _compare(self, list_a, list_b):
""" 比较 """
for i in range(len(list_a)):
if int(list_a[i]) != int(list_b[i]):
return int(list_a[i]) - int(list_b[i])
return 0
def _compare2(self, indx_i, indx_j):
""" 比较 """
return self.rnt_key_[indx_i] - self.rnt_key_[indx_j]
def _sort_rnt(self):
""" 排序 """
for i in range(1, len(self.rnt_)):
for j in range(0, len(self.rnt_) - i):
if self._compare2(j, j+1) > 0:
self.rnt_[j], self.rnt_[j + 1] = self.rnt_[j + 1], self.rnt_[j]
self.rnt_key_[j], self.rnt_key_[j + 1] = self.rnt_key_[j + 1], self.rnt_key_[j]
def solve(self, n, arr):
self._dfs(n, list(), arr, list()) # 深度优先搜索
# self._sort_rnt() # 排序(会超时,改为一边搜索,一边排序)
rnt = ""
for i in range(len(self.rnt_)-1):
rnt += "{}\n".format(" ".join(self.rnt_[i]))
rnt += "{}".format(" ".join(self.rnt_[-1]))
return rnt
import sys
if __name__ == '__main__':
is_IDE = False
if is_IDE:
fr = open("data/HJ77.txt", "r", encoding="utf-8")
else:
fr = sys.stdin
while True:
line_n = fr.readline().strip()
if line_n == "":
break
line_list = fr.readline().strip().split(" ")
print(Solution().solve(int(line_n), line_list))
if is_IDE:
fr.close()


京公网安备 11010502036488号