算法实验题3.1 车皮编序问题(栈+队列+dfs)

问题描述

在一个列车调度站中,1 条轨道连接到1 条侧轨处,形成1 个铁路转轨栈,如下图所示。 其中左边轨道为车皮入口,右边轨道为出口,编号为1,2,…,n 的n 个车皮从入口依次进 入转轨栈,由调度室安排车皮进出栈次序,并对车皮按其出栈次序重新编序a1, a2,., an 。

思路

  • 生成全排列,检验是否为出栈序列

虽然逻辑简单,但复杂度太高 O ( n ! ∗ n ) O(n!*n) O(n!n)

  • 对调度站进行模拟

不难发现,调度站是一个栈的结构,即LIFO。对于调度栈每次有如下几种操作:

  • 当还有为入站的车时,拉一辆未入进站的车入栈
  • 将站内的一辆车出栈

发现只有未入栈的车没有了,序列就以及定型了,就可以输出。
根据上述逻辑,可以写出如下算法:

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn = (int)1e5+5;
#define repU(i, a, b) for (int i = a; i <= b; i++)
#define repD(i, a, b) for (int i = a; i >= b; i--)

int n;
int stk[maxn], top = -1;
int que[maxn], tail = 0;
//对于栈每次有两次操作 push pop
int dfs (int idx) {
	if (idx == n) {
		repU(i, 0, tail-1) printf("%d ", que[i]);
		repD(i, top, 0) printf("%d ", stk[i]);
		putchar('\n');
		return 1;
	}
	int cnt = 0;

	if (top != -1) { //pop
    que[tail++] = stk[top--];
    cnt += dfs(idx);
    stk[++top] = que[--tail];
/*  注意区别
    top++;
    tail--;
*/
	}
  stk[++top] = idx+1;
  cnt += dfs(idx+1);
  top--;
	return cnt;
}

int main() {
	while (scanf("%d", &n)) {
    printf("count = %d\n", dfs(0));
    system("pause");
	}
	return 0;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小胡同的诗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值