火车调度问题

#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[n];
    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 开始,递归处理所有元素    
}   
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值