试题四[clrs上的装配调度,经典dp题]
/*
<1>f[0][0]=e[0]+a[0][0] f[1][0]=e[1]+a[1][0]
<2>f[0][j-1]+a[0][j]
<3>f[1][j-1]+a[1][j]<f[0][j-1]+t[0][j-1]+a[1][j]
<4>fi=f[0][n-1]+x[0]  li=0
<5>fi=f[1][n-1]+x[1]  li=1

    (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) 在同一条装配线上,底盘从一个工位转移到其下一个工位的时间可以忽略不计。
  该算法的输入为:
   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 处的最短装配时间。
*/

void Dp(){
 f[
0][0]=e[0]+a[0][0];
 f[
1][0]=e[1]+a[1][0];
 
for(int j=1;j<n;++j)
 
{
  
if(f[0][j-1]+a[0][j]<f[1][j-1]+a[0][j]+t[1][j-1])
   f[
0][j]=f[0][j-1]+a[0][j];
  
else
   f[
0][j]=f[1][j-1]+a[0][j]+t[1][j-1];
  
if(f[1][j-1]+a[1][j]<f[0][j-1]+t[0][j-1]+a[1][j])
   f[
1][j]=f[1][j-1]+a[1][j];
  
else
   f[
1][j]=f[0][j-1]+t[0][j-1]+a[1][j];
 }

 
if(f[0][n-1]+x[0]<=f[1][n-1]+x[1])
  fi
=f[0][n-1]+x[0],li=0;
 
else
  fi
=f[1][n-1]+x[1],li=1;
}


试题五[BFS,数据结构题]
函数 LevelTraverse()的功能是对给定树进行层序遍历。例如,对图 5-1 所示的树进 行层序遍历时,结点的访问次序为:D B A E F P C 。
对树进行层序遍历时使用了队列结构,实现队列基本操作的函数原型如下表所示:

函数原型
 说明
 
void InitQueue(Queue *Q)
 初始化队列
 
Bool IsEmpty(Queue Q)
 判断队列是否为空,若是则返回 TRUE,否则返回 FALSE
 
void EnQueue(Queue *Q,TreeNode p)
 元素入队列
 
void DeQueue(Queue *Q,TreeNode *p)
 元素出队列
 

  Bool、Status 类型定义如下:
   typedef enum {FALSE = 0,TRUE = 1} Bool;
   typedef enum {OVERFLOW = -2,UNDERFLOW = -1,ERROR = 0,OK = 1} Status;

  树的二叉链表结点定义如下:
   typedef struct Node {
    char data;
    struct Node *firstchild,*nextbrother;
   }Node,*TreeNode;

[函数]
  Status LevelTraverse(TreeNode root)
  
{ /*层序遍历树,树采用孩子-兄弟表示法,root 是树根结点的指针*/
   Queue tempQ;
   TreeNode ptr,brotherptr;
   
if (!root)
    
return ERROR;
   InitQueue(
&tempQ);
    (
1) ;   //(1) EnQueue(&tempQ,root)    
   brotherptr = root -> nextbrother;
   
while (brotherptr){ EnQueue(&tempQ,brotherptr);
     (
2) ; //(2)brotherptr = brotherptr -> nextbrother
   }
 /*end-while*/
   
while ( (3) ) {   // (3)!IsEmpty(&tempQ)
     (4) ;          // (4)DeQueue(&tempQ,ptr)  
    printf("%c\t",ptr->data);
    
if ( (5) ) continue//(5)!ptr->firstchild
     (6) ; //(6)EnQueue(&tempQ,ptr->firstchild)
    brotherptr = ptr->firstchild->nextbrother;
    
while (brotherptr){ EnQueue(&tempQ,brotherptr);
      (
7) ;//(7)brotherptr = brotherptr -> nextbrother
    }
 /*end-while*/
   }
 /*end-while*/
   
return OK;
  }
/*LevelTraverse*/

// 这题开始看题就看错了,以为是2叉树,想了半天,回头一看题,树的层次遍历..!orz..


试题六[考C++派生,继承]

[C++代码 1]
  
const int CLOSED = 1const int OPENING = 2;
  
const int OPEN = 3const int CLOSING = 4;
  
const int STAYOPEN = 5//定义状态变量,用不同整数表示不同状态

  
class Door {
  
private:
   
int state; //传输门当前状态
   void setState(int state)this->state = state; } //设置当前状态
  public:
   Door():state(CLOSED)
{};
   
void getState(){ //根据当前状态输出相应的字符串
    switch(state){
     
case OPENING: cout <<"OPENING" << endl; break;
     
case CLOSED: cout << "CLOSED" << endl; break;
     
case OPEN: cout << "OPEN" << endl; break;
     
case CLOSING: cout << "CLOSING" << endl; break;
     
case STAYOPEN: cout << "STAYOPEN" << endl; break;
    }

   }

   
void click() { //发生click事件时进行状态转换
    if ( (1) ) setState(OPENING);  //(1)state==CLOSED||state==CLOSING
    else if ( (2) ) setState(CLOSING); //(2)state==STAYOPEN||state==OPENING
    else if ( (3) ) setState(STAYOPEN);//(3)state==OPEN
   }

   
void timeout(){ //发生timeout事件时进行状态转换
    if (state == OPEN) setState(CLOSING);
   }

   
void complete(){ //发生complete事件时进行状态转换
    if (state == OPENING) setState(OPEN);
    
else if (state == CLOSING) setState(CLOSED);
   }

  }
;
  
int main(){
   Door aDoor;
   aDoor.getState(); aDoor.click(); aDoor.getState(); aDoor.complete();
   aDoor.getState(); aDoor.click(); aDoor.getState(); aDoor.click();
   aDoor.getState(); 
return 0;
  }


[C
++代码 2]
  
class Door {
  
public:
   DoorState 
*CLOSED, *OPENING, *OPEN, *CLOSING, *STAYOPEN, *state;
   Door();
   
virtual ~Door(){ ……  //释放申请的内存,此处代码省略};
   void setState(DoorState *state) this->state = state; }
   
void getState(){
    
// 此处代码省略,本方法输出状态字符串,
    
// 例如,当前状态为CLOSED时,输出字符串为“CLOSED”
   }
;
   
void click();
   
void timeout();
   
void complete();
  }
;


  Door::Door()
{
   CLOSED 
= new DoorClosed(this);    OPENING = new DoorOpening(this);
   OPEN 
= new DoorOpen(this);      CLOSING = new DoorClosing(this);
   STAYOPEN 
= new DoorStayOpen(this);  state = CLOSED;
  }

  
void Door::click(){ (4) ;}       //(4)state->click()
  void Door::timeout(){ (5) ; }    //(5)state->timeout()
  void Door::complete(){ (6) ; }   //(6)state->complete()

  
class DoorState //定义一个抽象的状态,它是所有状态类的基类
  {
  
protected: Door *door;
  
public:
   DoorState(Door 
*door) this->door = door; }
   
virtual ~DoorState(void);
   
virtual void click() {}
   
virtual void complete() {}
   
virtual void timeout() {}
  }
;

  
class DoorClosed :public DoorState{ //定义一个基本的 Closed 状态
  public:
   DoorClosed(Door 
*door):DoorState(door) {}
   
virtual ~ DoorClosed (){}
   
void click();
  }
;
  
void DoorClosed::click() { (7) ; } //(7)door->setState(door->OPENING)
  
// 其它状态类的定义与实现代码省略

  
int main(){
   Door aDoor;
   aDoor.getState(); aDoor.click();  aDoor.getState(); aDoor.complete();
   aDoor.getState(); aDoor.timeout(); aDoor.getState(); 
return 0;
  }


//派生,继承,方面的东西几乎忘干净了