火车调度问题
2016-03-31 22:27
429 查看
#include<iostream> #include <vector> #include <algorithm> #include <queue> #include <stack> using namespace std; int n = 3; void simu(int p, stack<int> b, int path[], int currlen) { if(p<=n) { b.push(p); simu(p+1,b,path,currlen); b.pop(); } if(!b.empty()) { path[currlen] = b.top(); int m = b.top(); b.pop(); simu(p,b,path,currlen+1); b.push(m); } if(b.empty() && currlen >n) { for(int i = 1; i < currlen;i++) cout<<path[i]<<" "; cout<<endl; } } int main() { stack<int>b; int path ; simu(1,b,path,1); }
#include<iostream> #include<stdio.h> #define MaxLen 100 struct snode{ int data[MaxLen]; int top; }s;//定义一个栈指针 int n;//定义输入序列总个数 void Initstack() { s.top=-1; } void push(int q)//元素n进栈 { s.top++; s.data[s.top]=q; } int pop()//出栈 { int temp; temp=s.data[s.top]; s.top--; return temp; } int Emptys()//判断栈空 { if(s.top==-1) return 1; else return 0; } /* 每次调用求值阶段包含两重递归,只有全部返回,才表示本pos 处理完, 可以对上一个元素求值,process 就是找出当前元素进栈后所有可能的操作, 即在当前元素进栈后各种情况下, 包括不出栈,立即出栈,出栈后继续出栈情况(出栈递归)下,继续处理下一个元素(入栈递归) */ void process(int pos,int path[],int curp)//当前处理位置pos的元素 { int m,i; if(pos<n)//编号进栈递归 { push(pos+1);//当前元素进栈后下一个元素继续进栈 process(pos+1,path,curp); //处理下一个元素,返回表明下一个元素进栈的情况处理完了 pop(); //不进站 } if(!Emptys())//递归处理出栈 { m=pop(); path[curp]=m; curp++; process(pos,path,curp);//出栈后处理下一个element push(m); //不出栈 } if(pos==n&&Emptys())//输出一种可能的方案 { for(i=0;i<curp;i++) printf("%2d",path[i]); printf("\n"); } } int main() { int path[MaxLen]; printf("输入要调度车厢总数:"); scanf("%d",&n); Initstack(); push(1); printf("所有输出序列:\n"); process(1,path,0); //从1 开始,递归处理所有元素 }
相关文章推荐
- mysql update语句的用法详解
- leetcode_033 Search in Rotated Sorted Array
- 蓝桥杯_算法提高_金明的预算方案(动态规划、01背包变形)
- 【MVC 4】6.SportsSore:导航
- UI复习笔记1
- STL vector,deque,list
- 对委托的初步研究
- python3中的mysql数据库操作
- RxJava中的错误处理
- bzoj 3343: 教主的魔法
- 多态
- Spring框架中IOC和aop
- Java实现微信菜单json字符串拼接
- 中科院
- 一天一个Java基础——泛型
- Synchronize实现原理(很难)
- <result><param></param></result>问题
- Linux_ pipe 匿名管道 浅解
- 程序启动与运行
- hduoj 1002 A + B Problem II(大数加法)