渡船问题!

qqpass2008 2007-06-19 03:05:10
一渡口,每条渡轮一次能装载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 */


能提供的代码以上,那位大虾能帮我完成余下的部分????先谢啦
...全文
654 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
qqpass2008 2007-06-22
  • 打赏
  • 举报
回复
试着写了一下,但出现好多错啊!帮我改正一下吧,另外那个print函数不会写啊,救救我吧!


#include "stdio.h"
#include "malloc.h"
#define Queuesize 100

typedef struct
{
int count;
int rear;
int front;
char data[Queuesize];
}SqQueue;

void InitQueue(SqQueue *q)
{
q->front=q->rear=0;
q->count=0;
return;
}

int EmptyQueue(SqQueue *q)
{
if(q->count==0)
{
return 1;
}
else
{
return 0;
}
}

void EnQueue(SqQueue *q,int x)
{
if(q->count==Queuesize)
{
printf("queue overflow\n");
return;
}
q->count++;
q->data[q->rear]=x;
q->rear=(q->rear+1)%Queuesize;
}

int OutQueue(SqQueue *q)
{
char x;
if(q->count==0)
{
printf("queue underflow\n");
return ' ';
}
x=q->data[q->front];
q->count--;
q->front=(q->front+1)%Queuesize;
return x;
}

void InitQueue(SqQueue *q);
int OutQueue(SqQueue *q);
void EnQueue(SqQueue *q,int x);
int EmptyQueue(SqQueue *q);

SqQueue q1,q2,q3;
int carn1=0,carn2=0,carn3=0;

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队*/
}
}
}


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 */

void main()
{
carinque();
Inship();
}
qqpass2008 2007-06-21
  • 打赏
  • 举报
回复
怎么没有人帮帮我啊!!!
qqpass2008 2007-06-20
  • 打赏
  • 举报
回复
顶起~~~
ReverseEngineering 2007-06-20
  • 打赏
  • 举报
回复
代码太长,又没注释!
qqpass2008 2007-06-20
  • 打赏
  • 举报
回复
试着写了一下,但出现好多错啊!帮我改正一下吧,另外那个print函数不会写啊,救救我吧!


#include "stdio.h"
#include "malloc.h"
#define Queuesize 100

typedef struct
{
int count;
int rear;
int front;
char data[Queuesize];
}SqQueue;

void InitQueue(SqQueue *q)
{
q->front=q->rear=0;
q->count=0;
return;
}

int EmptyQueue(SqQueue *q)
{
if(q->count==0)
{
return 1;
}
else
{
return 0;
}
}

void EnQueue(SqQueue *q,int x)
{
if(q->count==Queuesize)
{
printf("queue overflow\n");
return;
}
q->count++;
q->data[q->rear]=x;
q->rear=(q->rear+1)%Queuesize;
}

int OutQueue(SqQueue *q)
{
char x;
if(q->count==0)
{
printf("queue underflow\n");
return ' ';
}
x=q->data[q->front];
q->count--;
q->front=(q->front+1)%Queuesize;
return x;
}

void InitQueue(SqQueue *q);
int OutQueue(SqQueue *q);
void EnQueue(SqQueue *q,int x);
int EmptyQueue(SqQueue *q);

SqQueue q1,q2,q3;
int carn1=0,carn2=0,carn3=0;

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队*/
}
}
}


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 */

void main()
{
carinque();
Inship();
}
qqpass2008 2007-06-19
  • 打赏
  • 举报
回复
怎么越看越糊涂了??

那位大虾帮帮我吖!!!
cceczjxy 2007-06-19
  • 打赏
  • 举报
回复

一渡口,每条渡轮一次能装载6辆汽车过江,车辆分为客车、鲜货车和普通货车三类,规定;(1)同类汽车先到的先上船;(2)上船的优先级为:客车优先于鲜货车、鲜货车优先于普通货车;(3)每上三辆客车才允许上两辆鲜货车,然后再允许上一辆货车。若等待的客车不足三辆时,用鲜货车填补,当等待的鲜货车不足两辆时,按客车优先于普通货车的原则填补;当没有普通货车等待时,按客车优先于鲜货车的原则填补;(4)当装满六辆后则自动开船
楼上的大哥,入栈写的觉得是对的,
不过按照题目要求,车到渡口和车上船应该是个异步事件吧,
jixingzhong 2007-06-19
  • 打赏
  • 举报
回复
http://zhidao.baidu.com/question/24911223.html

思想上还是差不多的,
代码懒得写了,
楼主将就着看看先 ....
jixingzhong 2007-06-19
  • 打赏
  • 举报
回复
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】
xiakebuxing 2007-06-19
  • 打赏
  • 举报
回复
同意cceczjxy() ,我觉得三种车到渡口的机制应该是异步的。而车到渡口和车上船也是异步的。判断车上船的顺序就按照题目的要求做好了。

像Windows中的事件机制
星羽 2007-06-19
  • 打赏
  • 举报
回复
顶:)

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧