[数据结构与算法]HJ77 火车进站
https://www.nowcoder.com/practice/97ba57c35e9f4749826dc3befaeae109
给定一个正整数N代表火车数量,0<N<10,接下来输入火车入站的序列,一共N辆火车,每辆火车以数字1-9编号,火车站只有一个方向进出,同时停靠在火车站的列车中,只有后进站的出站了,先进站的才能出站。
要求输出所有火车出站的方案,以字典序排序输出。
数据范围:1≤n≤10
进阶:时间复杂度:O(n!) ,空间复杂度:O(n)
输入描述:
第一行输入一个正整数N(0 < N <= 10),第二行包括N个正整数,范围为1到10。
输出描述:
输出以字典序从小到大排序的火车出站序列号,每个编号以空格隔开,每个输出序列换行,具体见sample。
const rl = require('readline').createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
void (async function () {
const firstLine = await readline();
const secondLine = await readline();
const nums = secondLine.split(' ');
const res = stackOutInCase(nums);
res.forEach((item) => {
console.log(item);
});
})();
// 穷举所有可能出栈顺序
const stackOutInCase = (items) => {
let res = [];
// toIn:还未进入
// toOut:还未出去
// track:已经出去的
const dfs = (toIn, toOut, hadOut) => {
// 结束的条件
if (toIn.length === 0 && toOut.length === 0) {
// 存放结果
res.push(hadOut.join(''));
// 结束本次dfs
return;
}
// 从toIn里取出来
// 1.不进车 从栈尾出车
let train = toOut.pop();
if (train) {
hadOut.push(train);
// 然后接着遍历
dfs(toIn.slice(), toOut.slice(), hadOut.slice());
// 撤销上一步
toOut.push(train);
hadOut.pop();
}
// 2.只进车,不出车
train = toIn.shift();
if (train) {
toOut.push(train);
// 然后接着遍历
dfs(toIn.slice(), toOut.slice(), hadOut.slice());
}
};
dfs(items, [], []);
res.sort();
return res.map((item) => {
return item.split('').join(' ');
});
};