火车进栈
2013-11-18 19:29
204 查看
火车进栈From lydliyudong 背景 Background 话说这是NOI夏or冬令营中的水题...... 做题前明确的是,这题当然<>n皇后/全排列 这里有n列火车将要进站再出站…… 但是,每列火车只有1节---那就是车头…… 描述 Description 有n列火车按1到n的顺序从东方左转进站,这个车站是南北方向的,它虽然无限长, 只可惜是一个死胡同,而且站台只有一条轨道, 火车只能倒着从西方出去,而且每列火车必须进站,先进后出。 (某生:不就是个栈吗?每次可以让右侧头火车进栈,或者让栈顶火车出站? 占卜哥:闭嘴!) 就像这样: 出站<——- <——进站 |车| |站| |__| 现在请你按《字典序》输出前20种可能的出栈方案。 注意:这题当然不等于全排列!!! 输入格式 InputFormat 一个数n N<=20 数据保证不会TLE所以千万不要halt 输出格式 OutputFormat 《字典序》输出前20种答案,每行一种,不要空格
3
123
132
213
231
321
深搜加栈,每次搜索时有两种状态可选,进栈还是出栈
#include <stdio.h> int n, d; int stack[22], top = 0, k = 0; int w = 0; int a[22]; int sum = 0; int over = 0; void dfs(){ int i, j; if(over) return; d++; for(i = 0; i < 2; ++i) { if(i == 0) { if(top == 0) continue; top--; a[k++] = stack[top]; if(d == 2 * n) { if(sum >= 20) { over = 1; return; } for(j = 0; j < n; ++j) { printf("%d", a[j]); } sum++; printf("\n"); } else dfs(); k--; stack[top] = a[k]; top++; } else { w++; stack[top++] = w; if(w <= n) dfs(); w--; top--; } } d--; } int main(void){ scanf("%d", &n); dfs(); return 0; }
相关文章推荐
- [日记] 差点没有赶上火车
- 关于坐火车
- 一个民工在火车上的遭遇(笑过后是泪水!)
- 火车上的思考
- 火车入栈出栈序列
- 为什么我喜欢坐火车
- 比火车硬座票还便宜的机票预订方法
- 想做一个显示全国火车运行图的网站(6)第一阶段
- 火车上的遭遇(暴笑后请沉思 ,不看会后悔的)
- 10-12-站着火车去上海
- 上海到香港特快火车,卧铺才268,嗯,想去hk了,先期待下张谨两口子带回来点什么好吃的呢
- [数论]火车进出栈卡特兰数
- 火车运煤问题分析
- 原创,PHP简单的查询火车时刻表程序
- 3岁女童火车上突发心脏病 列车紧急提速救人
- 一个火柴模式问题和一个火车运煤问题
- 火车上认识的大荆姑娘
- 当技术遇到火车——IT男技术自救
- Problem 1802 —— 火车调度
- 火车车厢重排(链队列)