首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

渡船有关问题

2012-03-05 
渡船问题!一渡口,每条渡轮一次能装载6辆汽车过江,车辆分为客车、鲜货车和普通货车三类,规定;(1)同类汽车先

渡船问题!
一渡口,每条渡轮一次能装载6辆汽车过江,车辆分为客车、鲜货车和普通货车三类,规定;(1)同类汽车先到的先上船;(2)上船的优先级为:客车优先于鲜货车、鲜货车优先于普通货车;(3)每上三辆客车才允许上两辆鲜货车,然后再允许上一辆货车。若等待的客车不足三辆时,用鲜货车填补,当等待的鲜货车不足两辆时,按客车优先于普通货车的原则填补;当没有普通货车等待时,按客车优先于鲜货车的原则填补;(4)当装满六辆后则自动开船。  


根据分析处理如下:  
(1)汽车若渡江则根据汽车类型入队,假设:用1代表客车,2代表鲜货车,3代表普通货车。所以要设三个队列,用以区别汽车类型和到达的先后顺序,  

汽车入队算法如下:
LQueqe   q1,q2,q3;
InitQueqe(q1);   InitQueue(q2);   InitQueue(q3);
void     carinque()   {   /*     汽车入队     */
int   i,x;
      scanf(“%d,%d”,&i,&x);
      if(x <1   ||   x> 3)     printf(“输入汽车类型错误\n”)   ;
      else
        {   switch(x)
              {case   1:   EnQueue(q1,i);     break;   /*   客车进q1队   */
                case   2:   EnQueue(q2,   i);     break;   /*   鲜货车进q2队   */
                case   3:   EnQueue(q3,   i);     break;   /*   普通货车进q2队*/
            }
    }
}

(2)渡轮到后按规则上船,a[6]是开进渡轮车数组,算法如下:  

int   carn1=carn2=carn3=0;
int     Inship(   )
{int   n;
  n=carn1+carn2+carn3;
  while   (!EmptyQueue(q1)   ||   !EmptyQueue(q2)   ||!EmptyQueue(q3))
    {   while   (!EmptyQueue(q1)&&   n <6   &&   carn1 <3)
        {   a[n++]=OutQueue(q1);carn1++;     }
    if(n==6)   {   Print(a,n);   return   1;}   //print是一函数

while(!EmptyQueue(q2)   &&   n <6   &&   carn1+carn2 <5)
        {a[n++]=OutQueue(q2);   carn2++;}
          if(n==6)   {   Print(a,n);   return   1;}/*   满6辆则开船   */
if(!EmptyQueue(q3))  
              {   a[n++]=OutQueue(q3);     carn3++;}
        if(n==6)   {   Print(a,n);   return   1;}
        }   /*   While   */
    if(carn1+carn2+carn3 <6)
      printf( "渡轮上有%d辆车,继续等待......\n“
                        ,carn1+carn2+carn3);
}/*   Inship   */


能提供的代码以上,那位大虾能帮我完成余下的部分????先谢啦

[解决办法]
1.本程序中,将客车类定义一个队KE,货车类定义一个队HE,过江渡船定义成一个栈DC。栈采用顺序存储结构,队采用链式存储结构。
#define sqstack_maxsize 10
typedef struct sqstack
{DataType data[sqstack_maxsize];
int top;
}SqStackTp;
typedef struct linked_queue
{DataType data;
struct linked_queue *next;
}LqueueTp;
typedef struct queueptr
{LqueueTp *front,*rear;
}QueptrTp;
int InitStack(SqStackTp *sq) {sq-> top=0; return(1);}
void InitQueue (QueptrTp *lp)
{LqueueTp *p;
p=(LqueueTp * )malloc(sizeof(LqueueTp));
lq-> front=p;
lq-> rear=p;
( lq-> front)-> next=NULL;
}
int QutQueue(QueptrTp *lp,Data Type *x)
{LqueueTp *s;
if (lq-> front==lq-> rear) {error(“队空”);return(0);}
else {s=(lq-> front)-> nest;
*x=s-> data;
(lq-> front)-> next=s-> next;


if (s-> next == NULL) lq-> rear=llq-> front;
free(s);
return(1);
}
}
int EmptyQueue(QueptrTp lq)
{if (lq.rear==lq.front) return(1);
return(0);
}
int Push (SqStackTp *sq , DataType x)
{ if (sq -> top = =sqstack_maxsize-q) {return(0);}
else {sq -> top++; sq-> data[sq-> top]=x;
return(1);}
}
void main()
{ SqStackTp DC; //DC表示渡船
QueptrtTp KE ,HE; // KE表示客车E、HE表示货车
Int t ,j=0;
Initstack(DC);
Initqueue(KE);
Initqueue(HE);
While(DC.top <sqstack_maxsize)
{j=o;
for (I=I;j <=4;I++) //先上4辆客车
if (!emptyqueue(KE)&&(DC.top <sqstack_maxsize))
{ outqueue (&KE, &t);Push (&DC, t ); j++:}
for (I=j;I <5;I++) //再上1辆货车或客车不足时用货车补足
if (!emptyqueue(HE)&& (DC.top < sqstack _maxsize))
{outqueue(&HE,&t); Push(&DC, t);j++;}
if (j <5) for (I=j;I <5;I++) // 当货车不足时用客车补足
if (!emptyqueue(KE)&&(DC.top <sqstack_maxsize))
{outqueue(&KE,&t);Push (&DC,t ) ; j++}
else printf (“客车、货车合计不足10辆!”);
}
}
【http://www.qqread.com/download-qqread/datebase/da03.doc】
[解决办法]
http://zhidao.baidu.com/question/24911223.html

思想上还是差不多的,
代码懒得写了,
楼主将就着看看先 ....
[解决办法]

一渡口,每条渡轮一次能装载6辆汽车过江,车辆分为客车、鲜货车和普通货车三类,规定;(1)同类汽车先到的先上船;(2)上船的优先级为:客车优先于鲜货车、鲜货车优先于普通货车;(3)每上三辆客车才允许上两辆鲜货车,然后再允许上一辆货车。若等待的客车不足三辆时,用鲜货车填补,当等待的鲜货车不足两辆时,按客车优先于普通货车的原则填补;当没有普通货车等待时,按客车优先于鲜货车的原则填补;(4)当装满六辆后则自动开船
楼上的大哥,入栈写的觉得是对的,
不过按照题目要求,车到渡口和车上船应该是个异步事件吧,
[解决办法]
同意cceczjxy() ,我觉得三种车到渡口的机制应该是异步的。而车到渡口和车上船也是异步的。判断车上船的顺序就按照题目的要求做好了。

像Windows中的事件机制

热点排行