渡船问题!
一渡口,每条渡轮一次能装载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中的事件机制