CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
花落谁家,你作主! 盛大widget设计大赛英雄榜
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  专题开发/技术/项目 >  数据结构与算法

数据结构一题!!

楼主aisenhaoweier(山木散人)2002-07-13 21:11:35 在 专题开发/技术/项目 / 数据结构与算法 提问

内容:本人现有一难题无法解决,望高手赐教,具体如下:  
  车厢调度问题:(用堆栈——顺序栈实现)调度入口有序列号为1,2,3....n的车厢,求从输出口输出的长度为n的车厢序列  
  望高手赐教算法!!多谢       最好能用c实现/  
  200分等你!!!  
  问题点数:20、回复次数:6Top

1 楼quicmous(快鼠)回复于 2002-07-13 22:47:07 得分 0

C语言源代码如下。说明:  
   
  1.MAXNUM为车厢数;  
  2.MAXCOPY用于保存已经打印方案的数量,防止打印重复的方案。实际上它的值设为MAXNUM的  
   
  阶乘比较合适,这样可以在print_result中动态申请内存,程序就比较完善了。因为我从网  
   
  上临时下载的BC3.1没有联机帮助,我记不清楚如何动态申请内存了,因此留有一个小小的瑕  
   
  毗。  
  3.pass,push,pop为三种可能的操作,它们返回操作后的列车状态TRAIN。  
  4.display(X)打印X状态下可能的输出。  
   
   
  #include   <stdio.h>  
  #include   <mem.h>  
   
  #define   MAXNUM   4  
  #define   MAXCOPY   100  
   
  typedef   struct   {  
      int   R[MAXNUM];//进站的队列  
      int   S[MAXNUM];//栈  
      int   T[MAXNUM];//出站的队列  
      int   RCount,SCount,TCount;//三个队列的长度  
  }   TRAIN;  
   
  TRAIN   pass(TRAIN   X){  
        X.T[X.TCount]=X.R[X.RCount-1];  
        X.RCount--;  
        X.TCount++;  
        return   X;  
  }  
   
  TRAIN   push(TRAIN   X){  
        X.S[X.SCount]=X.R[X.RCount-1];  
        X.RCount--;  
        X.SCount++;  
        return   X;  
  }  
   
  TRAIN   pop(TRAIN   X){  
        X.T[X.TCount]=X.S[X.SCount-1];  
        X.SCount--;  
        X.TCount++;  
        return   X;  
  }  
   
  void   print_result(TRAIN   X){  
        static   int   TCOPY[MAXCOPY][MAXNUM];  
        static   int   COPYCOUNT=0;  
        for   (int   i=0;i<COPYCOUNT;i++){  
            for   (int   j=0;j<MAXNUM;j++){  
                if   (TCOPY[i][j]!=X.T[j])   goto   NextCopy;  
            }  
            return;  
  NextCopy:  
        }  
        for   (i=0;i<MAXNUM;i++){  
              printf("%d",X.T[i]);  
              TCOPY[COPYCOUNT][i]=X.T[i];  
        }  
        printf("\n");  
        COPYCOUNT++;  
  }  
   
  void   display(TRAIN   X){  
        if   (!X.RCount)   {  
              if   (!X.SCount)   print_result(X);  
              else   display(pop(X));  
   
        }  
        else   {  
              display(pass(X));  
              display(push(X));  
              if   (X.SCount)   display(pop(X));  
        }  
  }  
   
  void   main(){  
        TRAIN   X;  
        for   (int   i=0;i<MAXNUM;i++)   X.R[i]=MAXNUM-i;  
        X.RCount=MAXNUM;  
        X.SCount=0;  
        X.TCount=0;  
        display(X);  
  }  
  Top

2 楼zhoukun666(我喜欢==〉{ 。}{ 。})回复于 2002-07-15 20:15:01 得分 0

http://www.csdn.net/expert/topic/775/775678.xml?temp=.5317194Top

3 楼zhoukun666(我喜欢==〉{ 。}{ 。})回复于 2002-07-15 20:17:35 得分 0

http://www.csdn.net/expert/topic/868/868504.xml?temp=.2995264Top

4 楼atlantis13579(更深的蓝)(^_^)回复于 2002-07-15 20:38:57 得分 20

【题目】火车调度问题  
  【参考程序】  
  const   max=10;  
  type   shuzu=array[1..max]   of   0..max;  
  var       stack,exitout:shuzu;  
              n,total:integer;  
   
  procedure   output(exitout:shuzu);  
  var   i:integer;  
  begin  
            for   i:=1   to   n   do   write(exitout[i]:2);writeln;  
            inc(total);  
  end;  
   
  procedure   find(dep,have,rest,exit_weizhi:integer;stack,exitout:shuzu);  
  {dep:步数,have:入口处有多少辆车;rest:车站中有多少车;}  
  {exit_weizhi:从车站开出后,排在出口处的位置;}  
  {stack:车站中车辆情况数组;exitout:出口处车辆情况数组}  
  var   i:integer;  
  begin     {分入站,出站两种情况讨论}  
          if   have>0   then   begin         {还有车未入站}  
                stack[rest+1]:=n+1-have;       {入站}  
                if   dep=2*n   then   output(exitout)  
      else   find(dep+1,have-1,rest+1,exit_weizhi,stack,exitout);  
          end;  
          if   rest>0   then   begin         {还有车可出站}  
                exitout[exit_weizhi+1]:=stack[rest];       {出站}  
                if   dep=2*n   then   output(exitout) {经过2n步后,输出一种方案}  
      else   find(dep+1,have,rest-1,exit_weizhi+1,stack,exitout);  
        end;  
  end;  
   
  begin  
            writeln('input   n:');  
            readln(n);  
            fillchar(stack,sizeof(stack),0);  
            fillchar(exitout,sizeof(exitout),0);  
            total:=0;  
            find(1,n,0,0,stack,exitout);  
            writeln('total:',total);  
            readln;  
  end.  
   
  Top

5 楼atlantis13579(更深的蓝)(^_^)回复于 2002-07-15 20:39:09 得分 0

【解法2】用穷举二进制数串的方法完成.  
  uses   crt;  
  var   i,n,m,t:integer;  
          a,s,c:array[1..1000]   of   integer;  
  procedure   test;  
  var   t1,t2,k:integer;  
          notok:boolean;  
  begin  
            t1:=0;k:=0;t2:=0;  
            i:=0;  
            notok:=false;  
            repeat       {二进制数串中,0表示出栈,1表示入栈}  
                        i:=i+1;   {数串中第I位}  
                        if   a[i]=1   then   begin   {第I位为1,则表示车要入栈}  
                              inc(k);   {栈中车数}  
                              inc(t1);   {入栈记录,T1为栈指针,S为栈数组}  
                              s[t1]:=k;  
                          end  
                        else   {第I位为0,车要出栈}  
                            if   t1<1   then   notok:=true   {已经无车可出,当然NOT_OK了}  
                                                  else   begin   inc(t2);c[t2]:=s[t1];dec(t1);end;  
                                                {栈中有车,出栈,放到C数组中去,T2为C的指针,栈指针T1下调1}  
   
            until   (i=2*n)   or   notok;   {整个数串均已判完,或中途出现不OK的情况}  
            if   (t1=0)   and   not   notok   then   begin     {该数串符合出入栈的规律则输出}  
                  inc(m);write('[',m,']');  
                  for   i:=1   to   t2   do   write(c[i]:2);  
                  writeln;  
            end;  
  end;  
   
  begin  
            clrscr;   write('N=');readln(n);  
            m:=0;  
            for   i:=1   to   2*n   do   a[i]:=0;   {  
            repeat   {循环产生N位二进制数串}  
                        test;       {判断该数串是否符合车出入栈的规律}  
                        t:=2*n;  
                        a[t]:=a[t]+1;   {产生下一个二进制数串}  
                        while   (t>1)   and   (a[t]>1)   do   begin  
                                    a[t]:=0;dec(t);a[t]:=a[t]+1;  
                        end;  
            until   a[1]=2;  
            readln;  
  end.  
  N:               4                 6                 7                   8  
  TOTAL:     14               132             429               1430  
  Top

相关问题

  • 一道数据结构题
  • 一道简单的数据结构题?
  • 一道《数据结构》的例题。
  • 数据结构一题!!忘赐教
  • 急!一道数据结构题!!!!!
  • 求一数据结构问题
  • 数据结构的一个小问题?
  • 请教一个数据结构问题
  • 数据结构题
  • 《算法与数据结构》一章的一个问题。

关键词

  • 打印
  • exitout
  • maxnum
  • scount
  • train
  • tcount
  • rcount
  • 入栈
  • maxcopy
  • weizhi

得分解答快速导航

  • 帖主:aisenhaoweier
  • atlantis13579

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo