问答题[说明]以下是某图像二元树存储与还原算法的主要思想描述。设一幅2n×2n的二值图像,以:“1”表示黑像素点,以“0”表示白像素点。图像二元树结构表示依赖于图像的二元分割,即交替在X轴方向和Y轴方向上分割。先进行水平分割,分成两个2n-1×2n图像子块,然后进行垂直分割,分成4个2n-1×2n-1的正方形块,如此分割,直到子块只含同一像素点为止。如图8-8为一“E”字的二值图像,对其进行二元分割,相应的二元树如图8-9所示。根据图像二元树的0叶结点和1叶结点的数目,删除多者,保留少者。如“E”字图像的二元树0叶结点较多,裁剪后如图8-10所示。图8-8图8-10裁剪后的“E”字图像的二元树裁剪后图像二元树有4类结点,分别用二进制编码如下:◆左右儿子都有的结点,编码为11;◆仅有左儿子的结点,编码为10;◆仅有右儿子的结点,编码为01;◆叶结点,编码为00。存储时,先存储剩余叶结点的类型编码,二进制码00表示0叶结点,11表示1叶结点。再按层次顺序,自左至右存储裁剪后图像二元树各结点的编码。图像二元树的存储算法用C语言描述所定义的数据结构及函数如下:structNode{/*图像二元树结点*/streetNode*Left;streetNode*Right;charPixel;}structNodeQueue[MaxLen];/*队列*/InitQueue()/*初始化队列Queue的函数;*/EmptyQueue()/*判断队列Queue是否为空的数,若空返回1,否则返回0;*/AddQueue(Item)/*将Item加到队列Queue的数;*/GetQueue()/*取队列Queue第一个元素的函数;*/PutCode(Code)/*写2位二进制码Code到文件的函数*/还原算法是存储算法的逆过程,将文件中的二进制码序列转换成图像二元树。还原算法的数据结构与函数与存储算法的相同,还原算法新增了一个函数GetCode()。GetCode()/*从文件中读2位二进制码的函数*/[C程序]存储算法voidBackup(charCutPixel,structNodeImageTree)'/*CutPixel=0表示裁剪0叶结点*/{InitQueue();AddQueue(ImageTree);PutCode(1-CutPixel);While(!EmptyQueue()){TreeNode=GetQueue();if(TreeNode→Left==NULL){PutCode(0);continue:}Tl=TreeNode→Left;Tr=TreeNode→Right;if(Tl→Left==NULLelse{{{U}}(1){{/U}};AddQueue(Tl);}if(Tr→Left==NULLelse{{{U}}(2){{/U}}AddQueue(T);}{{U}}(3){{/U}}}}还原算法voidRestore(structNode*TreeRoot){TreeRoot=(strutNode*)malloc(sizeof(structNode)InitQueue();AddQueue(TreeRoot);CutPixel=1-GetCode();while(!EmptyQueue()){TrecNode=GetQueue(Queue);NodeCode=GetCode();switch(NodeCode){case0:TreeNode→Left=NULL;TreeNode→Right=NULLTreePixel={{U}}(4){{/U}};break;case1:Tr=(structNode*)mallocsizeof(structNode)TreeNode→Right=Tr;AddQueue(Tr);TI=(structNode*)mallocsizeof(structNode)Tl→Lefi-NULL;Tl→RightNULL;Tl→Pixel=CutPixel;break;case2:T1=(structNode*)mallocsizeof(structNode)TreeNode→Left=Tl;{{U}}(5){{/U}};Tr=(structNode*)malloc(sizeof(streetNode)Tr→Left=-NULL;Tr→Right=NULL,,Tr→Pixel=CutPixel;break;case3:T1=(structNode*)malloc(sizeof(structNode)TreeNode→Right=Tl;AddQueue(T1);Tr=(structNode*)malloc(sizeof(structNodeTreeNode→Right=Tr;AddQueue(Tr);break;}}}
问答题试题六(共15分)阅读下列说明和JAVA代码,将应填入(n)处的字句写在答题纸的对应栏内。【说明】现欲构造一文/目录树,采用组合(Composite)设计模式来设计,得到的类图如6-1所示:
问答题【说明】现要编写一个画矩形的程序,目前有两个画图程序:DP1和DP2,DP1用函数draw_a_line(x1,y1,x2,y2)画一条直线,DP2则用drawline(x1,x2,y1,y2)画一条直线。当实例画矩形时,确定使用DP1还是DP2。为了适应变化,包括“不同类型的形状”和“不同类型的画图程序”,将抽象部分与实现部分分离,使它们可以独立地变化。这里,“抽象部分”对应“形状”,“实现部分”对应“画图”,与一般的接口(抽象方法)与具体实现不同。这种应用称为Bridge(桥接)模式。图9-6显示了各个类间的关系。这样,系统始终只处理3个对象:Shape对象、Drawing对象、DP1或DP2对象。以下是Java语言实现,能够正确编译通过。【Java代码】//DP1.java文件publicclassDP1{staticpublicvoiddraw_aline(doublex1,doubley1,doublex2,doubley2){//省略具体实现}}//DP2.java文件publicclassDP2{staticpublicvoiddrawline(doublex1,doubley1,doublex2,doubley2){//省略具体实现}}//Drawing.java文件{{U}}(1){{/U}}publicclassDrawing{abstractpublicvoiddrawLine(doublex1,doubley1,doublex2,doubley2);}//V1Drawing.java文件publicclassV1DrawingextendsDrawing{publicvoiddrawLine(doublex1,doubley1,doublex2,doubley2){DP1.draw_a_line(x1,y1,x2,y2);}}//V2Drawing.java文件publicclassV2DrawingextendsDrawing{publicvoiddrawLine(doublex1,doubley1,doublex2,doubley2)(//画一条直线{{U}}(2){{/U}};}}//Shape.java文件abstractpublicclassShape{abstractpublicvoiddraw();private{{U}}(3){{/U}}_dp;Shape(Drawingdp){_dp=dp;}protectedvoiddrawLine(doublex1,doubley1,doublex2,doubley2){{{U}}(4){{/U}};}}//Rectangle.java文件publicclassRectangleextendsShape{privatedouble_x1,_x2,_y1,_y2;publicRectangle(Drawingdp,doublex1,doubley1,doublex2,doubley2){ {{U}}(5){{/U}};_x1=x1;_x2=x2;_y1=y1;_y2=y2;}publicvoiddraw(){//省略具体实现}}
问答题[说明]某地区举行篮球比赛,需要开发一个比赛信息管理系统来记录比赛的相关信息。[需求分析结果]1.登记参赛球队的信息。记录球队的名称、代表地区、成立时间等信息。系统记录球队的每个队员的姓名、年龄、身高、体重等信息。每个球队有一个教练负责管理球队,一个教练仅负责一个球队。系统记录教练的姓名、年龄等信息。2.安排球队的训练信息。比赛组织者为球队提供了若干个场地,供球队进行适应性训练。系统记录现有的场地信息,包括:场地名称、场地规模、位置等信息。系统可为每个球队安排不同的训练场地,如表3-9所示。系统记录训练场地安排的信息。表3-9训练安排表球队名称场地名称训练时间解放军一号球场2008-06-0914:00-18:00解放军一号球场2008-06-1209:00-12:00解放军二号球场2008-06-1114:00-18:00山西一号球场2008-06-1009:00-12:003.安排比赛。该赛事聘请有专职裁判,每场比赛只安排一个裁判。系统记录裁判的姓名、年龄、级别等信息。系统按照一定的规则,首先分组,然后根据球队、场地和裁判情况,安排比赛(每场比赛的对阵双方分别称为甲队和乙队)。记录参赛球队、比赛时间、比分、场地名称等信息,如表3-10所示。表3-10比赛安排表A组:甲队…乙队场地名称比赛时间裁判比分解放军…北京一号球场2008-06-1715:00李大明天津…山西一号球场2008-06-1719:00胡学梅B组甲队…乙队场地名称比赛时间裁判比分上海…安徽二号球场2008-06-1715:00丁鸿平山东…辽宁二号球场2008-06-1719:00郭爱琪4.所有球员、教练和裁判可能出现重名情况。[概念模型设计]根据需求阶段收集的信息,设计的实体联系图和关系模式(不完整)如下。1.实体联系图(图3-20)2.关系模式教练(教练编号,姓名,年龄)队员(队员编号,姓名,年龄,身高,体重,(a)球队(球队名称,代表地区,成立时间,(b)场地(场地名称,场地规模,位置)训练记录((c))裁判(裁判编号,姓名,年龄,级别)比赛记录((d))
问答题【说明】 供应商—零件—工程项目数据库由以下4个关系模式构成: S(SNO,SNAME,STATUS,CITY) P(PNO,PNAME,COLOR,WEIGHT,CITY) J(JNO,TNAME,CITY) SPJ(SNO,PNO,JNO,QTY) 其中,供应商S,零件P和工程项目J分别由供应商号(SNO),零件号(PNO)和工程项目号(JNO)唯一标识。供货SPJ是指由某个供应商向某个工程项目供应某些数量的某种零件。1. 【问题1】 请用SQL语言完成如下的操作。 ①找出给北京的工程项目提供不同的零件号: ②将没有供货的所有工程项目从J中删除; ③查询这样的工程项目号:供给该工程项目的零件P1的平均供应量大于供给工程项目n的任何一种零件的最大供应量。 【问题2】 定义一个视图,它由所有这样的工程项目(工程项目号与所在城市名称)组成:它们由供应商S1供货且使用零件P1。
问答题【说明】 本流程图是将中缀表示的算术表达式转换成后缀表示。如中缀表达式 (A-(B*C+D)*E)/(F+G)) 的后缀表示为 ABC*D+E*-FG+/ 为了方便,假定变量名为单个英文字母,运算符只有+、-、*、/(均为双目运算符,左结合),并假定所提供的算术表达是非空且语法是正确的。另外,中缀表示形式中无空格符,但整个算术表达式以空格符结束。流程图中使用的符号的意义如下: 数组 IN[]存储中缀表达式; 数组 POLISH[]存储其后缀表达式; 数组 S[]是一个后进先出栈; 函数PRIOR(CHAR)返回符号CHAR的优先级,各符号的优先级见表2: 表2 CHAR PRIOR(XHAR) */ + - ( ) 4 3 2 1 1. 【问题1】 填充流程图中①的判断条件。
问答题【问题2】(3 分)
【问题】中伪代码的时间复杂度为U(7)/U(用Ο 符号表示)。
问答题
问答题[问题3]
类通常不会单独存在,因此当对系统建模时,不仅要识别出类,还必须对类之间的相互关系建模。在面向对象建模中,提供了4种关系:依赖(dependency)、概括(generaliza tion)、关联(association)和聚集(aggregation)。分别说明这4种关系的含义,并说明关联和聚集之间的主要区别。
问答题【说明】 学校中有若干系,每个系有若干班级和教研室,每个教研室有若干教员,其中有的教授和副教授各带有若干研究生;每个班有若干学生,每个学生选修若干课程,每门课可由若干学生选修。
问答题【说明】清点盒子。本程序当用户输入一个整数值时,一切正常;当输入其他数值时,程序就出错。现在已做了改进,请填空。
import java. text. NumberFormat;
Public class InventoryLoop
{
public static void main(String args[])
{
String numBoxesIn;
Int numBoxes;
Double boxPrice=3.25;
Boolean gotGoodInput=false;
NumberFormat currency=NumberFormat.{{U}} (1) {{/U}};
do
{
System.out. print(“How many boxes do we have?”);
numBoxesIn=DummiesIO.{{U}} (2) {{/U}};
try
{
numBoxes=Integer.parseInt({{U}} (3) {{/U}});
system. out. print("The value is");
system.out. println(currency, format (numBoxes*boxPrice));
gotGoodInput=true;
catch({{U}} (4) {{/U}})
{
System.out.println();
System.out. println(That's not a number.");
}
}while({{U}} (5) {{/U}});//输入不正确时
System. out.println("That's that.");
}
}
问答题[说明]
本程序的函数sum(int i int total, int sigma, int rear, int d[], int n)用来从已知数组d的前n个元素中找出所有部分元素序列之和等于total的元素序列,约定数组d的元素都是正整数,且都小于等于total。
函数sum使用递归方法找出全部解答。参数i表示递归函数当前考虑元素d[i],参数sigma是调用前已选取的部分序列的元素和,参数rear是后面还未考虑的那部分元素的元素和。
函数对元素d[i]有以下两种可能的选择方案。
(1)考虑元素d[i]被包含在新的部分元素序列中的可能性。如果在当前部分元素序列之后接上d[i],新序列的元素和不超过total,则函数将d[i]包含在当前部分元素序列中。如果新的部分元素序列的元素和等于total,新的部分元素序列就是一个解答,函数将其输出;否则,若继续考虑后面的元素还有可能找到解答时,函数就递归去考虑后面的元素,寻找解答。最后,函数应恢复原来部分元素序列中不包含d[i]的状态。
(2)考虑元素d[i]不被包含在新的部分元素序列中的可能性。如果继续向d[i]之后考虑还是有希望能得到和为total的部分元素序列时,函数将新序列(不包含d[i])也作为一种可能的选择,并递归去考虑后面的元素,寻找解答。
[C程序]
#include <stdio. h>
#define N 100
int a[N];
int flg[N];
sum (int i, int total, int sigma, int rear, int d[], int t)
{
int j;
/* 考虑元素d[i]被包含在新的部分元素序列中的可能性 */
if (sigma + d[i] <=total) { /*如果d[i]与当前序列的和不超过total*/
flg[i]=1;/* d[i]被考虑在部分元素序列中 */
if (______=total) { /* 输出解 */
for (j=0; flg[j] == 0; j++) printf ("%4d = %d", total,d[j]);
for (j++; j <=i; j++) {
if (flg[j]) printf ("+%d", d[j]);
}
printf("");
} else if(i <n-1 && rear+sigma >=total)
/* 并且继续考虑后面的元素有可能找到解答时 */
sum (i+1, total, ______, rear-d[i], d, n);
______;
/* 考虑元素d[i]不被包含在新的部分元素序列中的可能性*/
if (i <n-1 && rear-d[i]+tigma >=total)
sum(i+1, total, ______, rear-d[i], d, n);
}
}
main()
{
int i, j, n, total, s, d;
printf ("输入 total! /n"); scanf ("%d",
printf ("输入 n! /n"); scanf ("%d", &n);
for (s = i = 0; i < n;) {
printf ("输入第%d个元素 > 0 且 <= %d)/n", i+1, total);
scanf ("%d", &d);
if (d < 1 || d > total) {
printf ("出错, 清重新输入! /n");
continue;
}
s+=(a[i++]=d);
}
sum (0, total, 0, ______, a, n);
printf ("/n/n");
}
问答题【说明】已知某类库开发商提供了一套类库,类库中定义了Application类和Document类,它们之间的关系如下图所示。其中,Application类表示应用程序自身,而Document类则表示应用程序打开的文档。Application类负责打开一个已有的以外部形式存储的文档,如一个文件,一旦从该文件中读出信息后,它就由一个Document对象表示。当开发一个具体的应用程序时,开发者需要分别创建自己的Application和Document子类,例如上图中的类MyApplication和类MyDocument,并分别实现Application和Document类中的某些方法。已知Application类中的openDocument方法采用了模板方法(TemplateMethod)设计模式,该方法定义了打开文档的每一个主要步骤,如下所示:1.首先检查文档是否能够被打开,若不能打开,则给出出错信息并返回;2.创建文档对象;3.通过文档对象打开文档;4.通过文档对象读取文档信息;5.将文档对象加入到Application的文档对象集合中。【C++代码】#include<iostream>#include<vector>usingnamespacestd;classDocument{public: voidsave(){/*存储文档数据,此处代码省略*/) voidopen(stringdocName){/*打开文档,此处代码省略*/) voidclose(){/*关闭文档,此处代码省略*/) virtualvoidread(stringdocName)=0;};classAppplication{private: vector<{{U}}(1){{/U}}>docs;/*文档对象集合*/public: boolcanOpenDocument(stringdocName){ /*判断是否可以打开指定文档,返回真值时表示可以打开, 返回假值表示不可打开,此处代码省略*/ } voidaddDocument(Document*aDocument){ /*将文档对象添加到文档对象集合中*/ docs.push_back({{U}}(2){{/U}}); } virtualDocument*doCreateDocument()=0;/*创建一个文档对象*/ voidopenDocument(stringdocName){/*打开文档*/ if({{U}}(3){{/U}}){ cout<<“文档无法打开!”<<endl; return; } {{U}}(4){{/U}}adoc={{U}}(5){{/U}}; {{U}}(6){{/U}}; {{U}}(7){{/U}}; {{U}}(8){{/U}}; }};
问答题【说明】流程图描述了某宽带数据专线管理系统的部分处理流程。(1)凡申请宽带数据专线使用者,均需填写专线申请表。系统把申请表存储在专线申请登记文件中,等待分配专线号。(2)系统为申请者指定专线号,并根据通信距离(按地区计算)、通信计算初装费和月租费,然后发初装通知单送给用户,并产生施工单交有关部门施工。同时产生专线处理文件。专线号是专线的唯一标识。(3)施工结束后,系统更新用户文件,并产生专线计费文件,作为以后收费的依据。(4)一个用户可以租用多条专线,用户可用现金或银行托付两种方式支付租金,但一个用户只能使用一种付款方式。系统每月按用户(而不是专线)为单位计费出账。(5)流程图中各数据文件及有关单据所含的数据项如下。专线申请表及专线中请登记文件:申请号、用户名称、付款方式,开户银行代码、账号、主端名称、主端地址、对端地址、对端所在地区、通信速率、设备接口、申请日期。专线处理文件;申请号、专线号、用户名称、付款方式、开户银行代码、账号、初装费、月租费、完工日期。初装费收据:专线号、初装费、交费日期。施工单:施工单号、专线号、主端名称、主端地址、对端所在地区,通信速率、设备接口、完工期限。完工单:施工单号、专线号、完工日期。用户文件:用户编号、用户名称、付款方式、开户银行代码、账号。专线计费文件:专线号、用户编号、月租金、开通日期。【问题1】宽带数据专线价目文件由哪些数据项组成?【问题2】为了避免在用户尚未支付初装费时就去施工,有人提议将图中从处理2产生的施工单改成从处理3产生施工单。试问从处理3能否产生施工单?为什么?【问题3】当一个用户使用多条专线时,若允许该用户对其中的一些专线采用现金支付,对另一些专线采用银行托付方式,则在尽量减少数据冗余的前提下,应如何调整有关的数据文件。
问答题【说明】设单链表的结点类和链表类的定义如下,链表不带有表头结点。请填空:
#include<iostream.h>
#include<assert.h>
template<class T>class List;
template<class T>class ListNOde{
friend {{U}}(1) {{/U}};
private:
T data;
ListNode<T> *link;
public:
ListNode():link(NULL)()
ListNOde(const T& item,ListNOde<T>*next=NULL)
:data(item),link(next){}
};
template<class T>class List{
private:
ListNode<T>*first;
void createList(T A[],int n,int i,ListNOde<T>*&p);
void printList(ListNOde<T>*p);
public:
List();
~List();
friend ostream& operator<<(ostream& ost,List<T>&L);
friend istream& operator>>(istream& ist,List<T>&L);
};
template<class T>
istream& operator>>(istream& ist,List<T>&1){
int i,n; ist>>n;
T A[n];
for(i=0;i<n;i++){{U}} (2) {{/U}};
createList(A,n,0,first);
}
template<class T>
void List<T>::createList(TA[],int n,int i,ListNOde<T>*& p){
//私有函数:递归调用建立单链表
if(i==n)p=NULL;
else{
p=new ListNode<T>(A[i]);
assert(p !=NULL);
createList({{U}} (3) {{/U}});
}
}
template<class T>
ostream& operator<<(ostream& ost,List<T>& L){
{{U}}(4) {{/U}};
}
template<class T>
void List<T>::printList(ostream& ost,ListNode<T>*p){
if(p!=NULL){
ost<<p->data;
{{U}} (5) {{/U}};
}
}
问答题{{B}}试题1~试题4是必答题{{/B}}阅读以下某网上信用卡管理系统的需求描述,根据要求回答问题1、问题2和问题3。
[说明]
某银行准备开发一个网上信用卡管理系统(CCMS),该系统的基本功能如下。
①信用卡申请。非信用卡客户填写信用卡申请表,说明所要申请的信用卡类型及申请者的基本信息,提交CCMS登录。如果信用卡申请被银行接受,客户会收到银行的确认函,并告知用户信用卡的有效期及信贷限额;否则银行会发送一封拒绝函给该客户。
客户收到确认函后,需再次登录CCMS,用信用卡号和密码激活该信用卡。激活操作结束后,CCMS将激活通知发送给客户,告知客户其信用卡是否被成功地激活。
②月报表生成。在每个月第1天的零点,CCMS为每个信用卡客户创建一份月报表,对该客户上月的信用卡交易情况及交易额进行统计。信用卡客户可以登录CCMS查看月报表,也可以要求CCMS提供打印出的月报表。
③信用卡客户信息管理。信用卡客户的个人信息可以在CCMS中进行在线的管理。每个信用卡客户可以在线查询其个人信息。
④信用卡交易记录。信用卡客户使用信息卡进行的每一笔交易都会记录在CCMS中。
⑤交易信息查询。信用卡客户可以登录CCMS查询并核实其信用卡交易记录及交易额。
问答题【说明】 有如下关系数据库: S(SNO,SN,STATUS,CITY) P(PNO,PN,COLORS,WEIGHT) J(JNO,JN,CITY) SPJ(SNO,PNO,JNO,QTY) 其中,S为供应单位,P为零件,J为工程项目,SPJ为工程订购零件的订单,其语义为:某供应单位供应某种零件给某个工程,请用SQL完成下列操作。
问答题阅读下列程序说明和C程序,将应填入 (n) 处的字句写在答卷纸的对应栏内。 【程序说明】 该程序定义了两个子函数strsort和strmerge。它们分别实现了将一个字符串按字母顺序排序和将两个字符串合并排序,并删去相同字符。在主函数里,先输入两个字符串s1和s2,然后调用strsort函数对它们分别排序,然后调用strmerge函数将s1和s2合并,将合并后的字符串赋给字符串s3,最后输出字符串s3。 【程序】 #include <stdio.h> void strmerge(char *a,char *b,char *c) //将字符串a,b合并到字符串c char t,*w; W=c; while( (1) ) //找到字符串a,b当前字符中较小的字符 if(*a<*b) t=-*a, (2) else if(*a>*b) t=*b; (3) else //字符串a,b 当前字符相等 t=-*a; a-H-; b-H-; if( (4) ) //开始,可直接赋值 *w=t; else if(t!=*w) //如果a,b中较小的当前字符与c中当前字符不相等,才赋值 (5) if(*a!='/O') //如果字符串a还没有结束,则将a的剩余部分赋给c while(*a!='/0') if(*a!=*w) *(++w)=*a; a++; else (6) if(*b!=",'/0') //如果字符串b 还没有结束,则将 b 的剩余部分赋给 c while(*b !='/0') if(*b!=*w) *(++w)=*b; b++; else b++; (7) void strsort(char *s) //将字符串 s 中的字符排序 int i,j,n; char t,*w; w=s; for(n=O;*w!='/O';n++) //得到字符串长度 n w++; for(i=O;i<n-1;i++) //对字符串 s 进行排序,按字母先后顺序 forO=i+ 1 ;j<n;j++) if( (8) t=s[i]; s[i]=s[j]; (9) void mainO char s1 [100],s2[100],s3[100]; prinff("/nlPlease input the first string:"); scanfC("% s",s1 ); prinff("/nPlease input the second string:"); scanf("%s",s2); strsort(s1); //将字符串s1 排序 strson(s2); //将字符串 s2 排序 prinff("%s/n',s1); printfC % sW',s2); s3[0]='/O'; //字符串 s3 的第一个字符先置'/0'结束标志 (10) ; //将s1和s2合并,按照字母顺序排列, prinff("%s",s3);
问答题问题:5.1 【C++代码】
#include
using namespace std;
class Invoice{
public:
(1) {
cout<<"This is the content of the invoice!"<
问答题[说明]某汽车制造工厂有两条装配线。汽车装配过程如图4-16所示,即汽车底盘进入装配线,零件在多个工位装配,结束时汽车自动完成下线工作。(1)e0和e1表示底盘分别进入装配线0和装配线1所需要的时间。(2)每条装配线有n个工位,第一条装配线的工位为S0,0,S0,1,…,S0,n-1,第二条装配线的工位为S1,0,S1,1,…,S1,n-1。其中S0,k和S1,k(0≤k≤n-1)完成相同的任务,但所需时间可能不同。(3)ai,j表示在工位Si,j处的装配时间,其中i表示装配线(i=0或i=1),j表示工位号(0≤j≤n-1)。(4)ti,j表示从Si,j处装配完成后转移到另一条装配线下一个工位的时间。(5)x0和x1表示装配结束后,汽车分别从装配线0和装配线1下线所需要的时间。(6)在同一条装配线上,底盘从一个工位转移到其下一个工位的时间可以忽略不计。图4-17所示的流程图描述了求最短装配时间的算法,该算法的输入为:n:表示装配线上的工位数;e[i]:表示e1和e2,i取值为0或1;a[i][j]:表示ai,j,i的取值为0或1,j的取值范围为0~n-1;t[i][j]:表示ti,j,i的取值为0或1,j的取值范围为0~n-1;x[i]:表示x0和x1,i取值为0或1。算法的输出为:fi:最短的装配时间;li:获得最短装配时间的下线装配线号(0或者1)。算法中使用的f[i][j]表示从开始点到Si,j处的最短装配时间。
