js/javascript/JS/Javascript/JavaScript/Js-牛客系列之HJ77.火车进站

该篇博客探讨了一个关于火车进站、出站顺序的问题,给定一定数量的火车和它们的入站序列,如何生成并按字典序排序所有可能的出站方案。博客中提供了一个解决方案,通过递归函数实现,首先判断递归结束条件,然后分别处理站外火车进站、站内火车出站的情况,最后将所有结果进行排序并输出。
摘要由CSDN通过智能技术生成
题目描述:

给定一个正整数N代表火车数量,0<N<10,接下来输入火车入站的序列,
一共N辆火车,每辆火车以数字1-9编号,火车站只有一个方向进出,同时停靠在火车站的列车中,
只有后进站的出站了,先进站的才能出站。
要求输出所有火车出站的方案,以字典序排序输出。
数据范围:1\le n\le 10\1≤n≤10 
示例:
	输入:
	3
	1 2 3
	复制
	输出:
	1 2 3
	1 3 2
	2 1 3
	2 3 1
	3 2 1
	复制
	说明:
	第一种方案:1进、1出、2进、2出、3进、3出
	第二种方案:1进、1出、2进、3进、3出、2出
	第三种方案:1进、2进、2出、1出、3进、3出
	第四种方案:1进、2进、2出、3进、3出、1出
	第五种方案:1进、2进、3进、3出、2出、1出
	请注意,[3,1,2]这个序列是不可能实现的。 
let num = parseInt(readline()) // 3
let arr = readline().split(' ') // [1,2,3]

solution(arr, num);
function solution(arr, num) {
  // arr 未驶进站台的火车
  let length = arr.length;
  let res = []; // 输出数组
  let inTrainArr = []; // 站中的火车
  let outTrainArr = []; // 驶出站台的火车

  helper(arr, num, inTrainArr, outTrainArr);

  res.sort();
  res.forEach((item) => {
    console.log(item.join(" "));
  });
  
  function helper(stand, n, inTrainArr, outTrainArr) {
    // 递归结束的条件是什么
    // 未驶进站台的火车 和 站台的火车都为空  即 驶出站台的火车数量 === n
    if (outTrainArr.length === n) {
      res.push([...outTrainArr]);
    }

    // 当火车还从没开始进来的时候
    if (stand.length === n) {
      inTrainArr.push(stand.shift());
      helper(stand, n, inTrainArr, outTrainArr);
      return;
    }

    // 当站外还有火车的时候
    if (stand.length > 0) {
      var cur = stand.shift();
      inTrainArr.push(cur);
      helper(stand, n, inTrainArr, outTrainArr);
      inTrainArr.pop();
      stand.unshift(cur);
    }

    // 当站内还有火车的时候
    if (inTrainArr.length > 0) {
      var cur = inTrainArr.pop();
      outTrainArr.push(cur);
      helper(stand, n, inTrainArr, outTrainArr);
      outTrainArr.pop();
      inTrainArr.push(cur);
    }
  }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值